我有两个表通过外键college_id链接它的代码都是使用蛋糕烘焙功能生成的。
每当我试图调用CakePHP为其中一个表生成的视图时,它总是会生成一条带错误的SQL语句。
错误为:
SQLSTATE[42000]:语法错误或访问冲突:1066不是唯一的表/别名:"Courses"
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
我知道错误在于在同一个查询中使用了两次别名"Courses"。这里:"FROM课程INNER JOIN课程"
但我找不到防止这种情况发生的方法。我查看了cakehp3.0的Linkingtables文档,但找不到定义别名命名方式的方法。有什么提示吗?
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
查看courses
表的架构,问题似乎是您调用了主键course_id
,而不是预期的id
。Cake bake
将把它解释为courses
表的外键(,即本身),因此创建一个belongsTo
关系。您应该重命名列id
,并坚持CakePHP的命名约定。
偏离命名惯例几乎总是会给你带来更多的麻烦。如果你不符合标准,就不能指望bake
知道如何正确构建你的应用程序。
很少有理由不使用公约。