2015-11-03 67 views
-5

我有兩個表通過外鍵鏈接 - college_id 它的代碼都是使用蛋糕烘烤功能生成的。CakePHP爲兩個鏈接表生成SQL語句錯誤。不唯一別名

每當我嘗試調用由CakePHP爲其中一個表生成的視圖時,它總是生成一個帶有錯誤的SQL語句。

的錯誤是:

SQLSTATE [42000]:語法錯誤或訪問衝突:1066不是唯一的表/別名: '課程'

SQL語句:

SELECT Courses.course_id AS `Courses__course_id`, Courses.course_name AS `Courses__course_name`, Courses.cource_code AS `Courses__cource_code`, Courses.college_id AS `Courses__college_id`, Colleges.college_id AS `Colleges__college_id`, Colleges.college_name AS `Colleges__college_name` 
FROM courses Courses 
    INNER JOIN courses Courses ON Courses.course_id = (Courses.course_id) 
    INNER JOIN colleges Colleges ON Colleges.college_id = (Courses.college_id) 
LIMIT 20 OFFSET 0 

我知道這個錯誤是在同一查詢中使用兩次別名「課程」的事實。 這裏:「FROM課程INNER JOIN課程課程」

但我找不到防止這種情況發生的方法。 我查看了CakePHP 3.0的鏈接表文檔,但我無法找到一種方法來定義它命名這個別名的方式。 任何提示?

CoursesTable.php

<?php 
namespace App\Model\Table; 

use App\Model\Entity\Course; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Table; 
use Cake\Validation\Validator; 

/** 
* Courses Model 
* 
* @property \Cake\ORM\Association\BelongsTo $Courses 
* @property \Cake\ORM\Association\BelongsTo $Colleges 
*/ 
class CoursesTable extends Table 
{ 

    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->table('courses'); 
     $this->displayField('course_name'); 
     $this->primaryKey('course_id'); 

     $this->belongsTo('Courses', [ 
      'foreignKey' => 'course_id', 
      'joinType' => 'INNER' 
     ]); 
     $this->belongsTo('Colleges', [ 
      'foreignKey' => 'college_id', 
      'joinType' => 'INNER' 
     ]); 
    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator 
      ->requirePresence('course_name', 'create') 
      ->notEmpty('course_name') 
      ->add('course_name', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); 

     $validator 
      ->requirePresence('cource_code', 'create') 
      ->notEmpty('cource_code'); 

     return $validator; 
    } 

    /** 
    * Returns a rules checker object that will be used for validating 
    * application integrity. 
    * 
    * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. 
    * @return \Cake\ORM\RulesChecker 
    */ 
    public function buildRules(RulesChecker $rules) 
    { 
     $rules->add($rules->existsIn(['course_id'], 'Courses')); 
     $rules->add($rules->existsIn(['college_id'], 'Colleges')); 
     return $rules; 
    } 
} 

課程表模式:

course_id - PK 
course_name 
course_dode 
college_id - FK 
+0

你爲什麼要加入「課程」?你對連接的數據沒有做任何事情。只需將「課程」加入「學院」;無需將課程加入課程,然後再加入學院。 –

+0

我明白你的意思確實不需要。 代碼是由蛋糕自動生成的,所以它以某種方式搞砸了。 我確實看過表格的定義,但都很好看。 '$ this-> table('courses'); $ this-> displayField('course_name'); $ this-> primaryKey('course_id'); $ this-> belongsTo('Colleges',[ 'foreignKey'=>'college_id', 'joinType'=>'INNER' ]); $ this-> belongsTo('Courses',[ 'foreignKey'=>'course_id', 'joinType'=>'INNER' ]);' – Nandox7

+0

您是否打算讓課程屬於課程關係?看起來你錯誤地設置了這個關聯。 – drmonkeyninja

回答

0

看你的架構爲courses表中的問題似乎是,你已經叫你的主鍵course_id而不是預計id。蛋糕bake將解釋爲courses表(,即本身)的外鍵,因此創建belongsTo關係。您應該重命名id列並堅持使用CakePHP's naming conventions

從命名約定中分流幾乎總會給你帶來麻煩,而不是它的價值。如果您不符合標準,則不能期望bake知道如何正確構建您的應用。

很少有不使用慣例的情況是合理的。

+1

你釘了它。謝謝。 我沒有閱讀CakePHP約定文檔,但我誤解了表格ID命名。 模式更改並烘烤完畢,現在工作正常。 – Nandox7