2015-11-03 66 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