我有两个表通过外键链接 - 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
你为什么要加入“课程”?你对连接的数据没有做任何事情。只需将“课程”加入“学院”;无需将课程加入课程,然后再加入学院。 –
我明白你的意思确实不需要。 代码是由蛋糕自动生成的,所以它以某种方式搞砸了。 我确实看过表格的定义,但都很好看。 '$ 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
您是否打算让课程属于课程关系?看起来你错误地设置了这个关联。 – drmonkeyninja