我的 Controller 中的查询对象在这里:
$this->Users
->find('all')
->matching('Projects')
->where(['User_has_access.projectid' => $id]);
创建此查询:
'sql' => '
SELECT
Users.userid AS `Users__userid`,
Users.email AS `Users__email`,
Users.password AS `Users__password`,
Users.first_name AS `Users__first_name`,
Users.last_name AS `Users__last_name`,
Users.affiliation AS `Users__affiliation`,
Users.address AS `Users__address`,
Users.city AS `Users__city`,
Users.state AS `Users__state`,
Users.zip AS `Users__zip`,
Users.phone AS `Users__phone`,
Users.role AS `Users__role`,
Users.created_at AS `Users__created_at`,
Users.modified AS `Users__modified`,
Users.deleted AS `Users__deleted`,
Projects.projectid AS `Projects__projectid`,
Projects.userid AS `Projects__userid`,
Projects.name AS `Projects__name`,
Projects.point_of_contact AS `Projects__point_of_contact`,
Projects.description AS `Projects__description`,
Projects.start_date AS `Projects__start_date`,
Projects.end_data_date AS `Projects__end_data_date`,
Projects.end_date AS `Projects__end_date`,
Projects.testing_for AS `Projects__testing_for`,
Projects.monday AS `Projects__monday`,
Projects.tuesday AS `Projects__tuesday`,
Projects.wednesday AS `Projects__wednesday`,
Projects.thursday AS `Projects__thursday`,
Projects.friday AS `Projects__friday`,
Projects.saturday AS `Projects__saturday`,
Projects.sunday AS `Projects__sunday`,
Projects.created_at AS `Projects__created_at`,
Projects.modified AS `Projects__modified`,
Projects.deleted AS `Projects__deleted`,
User_has_access.userid AS `User_has_access__userid`,
User_has_access.projectid AS `User_has_access__projectid`,
User_has_access.access AS `User_has_access__access`,
User_has_access.created_at AS `User_has_access__created_at`,
User_has_access.modified AS `User_has_access__modified`
FROM
users Users
INNER JOIN
projects Projects
ON 1 = 1
INNER JOIN
user_has_access User_has_access
ON (
Users.userid = (
User_has_access.user_id
)
AND Projects.projectid = (
User_has_access.project_id
)
)
WHERE
User_has_access.projectid = :c0
',
'params' => [
':c0' => [
'value' => '28',
'type' => null,
'placeholder' => 'c0'
]
],
问题在于内部联接
INNER JOIN
user_has_access User_has_access
ON (
Users.userid = (
User_has_access.user_id
)
AND Projects.projectid = (
User_has_access.project_id
)
)
在user_has_access
中使用了不正确的字段名称,其中user_id
和project_id
应为userid
和projectid
。除此之外,查询执行应该执行的操作,即查找与特定项目 ID 关联的所有用户。用户可以拥有多个项目,项目也可以拥有多个用户。
表类在这里:
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('userid');
$this->primaryKey('userid');
$this->addBehavior('Timestamp');
$this->hasMany('Datapoints',[
'foreignKey' => 'userid'
]);
//$this->hasMany('Projects',[
// 'foreignKey' => 'userid'
//]);
$this->belongsToMany('Projects', [
'through' => 'User_has_access',
]);
}
}
这里:
class ProjectsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('projects');
$this->displayField('name');
$this->primaryKey('projectid');
$this->addBehavior('Timestamp');
$this->hasMany('Datapoints',[
'foreignKey' => 'projectid'
]);
$this->belongsToMany('Users', [
'through' => 'User_has_access',
]);
}
这里:
class User_has_accessTable extends Table
{
public function initalize(array $config)
{
parent::initalize($config);
$this->entityClass('App\Model\Entity\User_has_access');
$this->table('user_has_access');
$this->addBehavior('Timestamp');
$this->belongsTo('Projects', [
'foreignKey' => 'projectid',
'joinType' => 'INNER',
]);
$this->belongsTo('Users',[
'foreignKey' => 'userid',
'joinType' => 'INNER',
]);
}
}
最佳答案
我解决了这个问题。问题是,当我应该让 Cake 烘烤它们时,我却手动创建了模型文件。我还检查了数据库并更改了表和字段名称以遵循 Cake 的命名约定。这似乎解决了一切
关于php - CakePHP 3 查询生成不正确的字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797722/