Cakephp 与相关表的Innerjoin始终以“结束”;与“不相关”;错误
我想进行此查询(Cakephp 与相关表的Innerjoin始终以“结束”;与“不相关”;错误,cakephp,orm,associations,model-associations,Cakephp,Orm,Associations,Model Associations,我想进行此查询($ownerQuery是此处的相关部分): 或者达到相同效果的东西,但是我尝试过的每一种变化最终都会产生一个与错误无关的结果 以下是我的联想: ProjectsTicketsTable: class ProjectsTicketsTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->t
$ownerQuery
是此处的相关部分):
或者达到相同效果的东西,但是我尝试过的每一种变化最终都会产生一个与错误无关的结果
以下是我的联想:
ProjectsTicketsTable:
class ProjectsTicketsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('projects_tickets');
$this->displayField('project_id');
$this->primaryKey(['project_id', 'ticket_id']);
//$this->belongsTo('Projects', [
// 'foreignKey' => 'project_id',
// 'joinType' => 'INNER'
//]);
//$this->belongsTo('Tickets', [
// 'foreignKey' => 'ticket_id',
// 'joinType' => 'INNER'
//]);
$this->belongsTo('Projects');
$this->belongsTo('Users');
}
}
class TicketsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('tickets');
$this->displayField('title');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
//$this->belongsToMany('Projects', [
// 'foreignKey' => 'ticket_id',
// 'targetForeignKey' => 'project_id',
// 'joinTable' => 'projects_tickets'
//]);
$this->belongsToMany('Projects', [
'through' => 'ProjectTickets',
]);
$this->belongsToMany('Comments', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'comment_id',
'joinTable' => 'tickets_comments'
]);
$this->belongsToMany('Users', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'user_id',
'joinTable' => 'tickets_users'
]);
}
}
ProjectsTable:
class ProjectsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('projects');
$this->displayField('title');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Tags', [
'foreignKey' => 'tag_id',
'joinType' => 'INNER'
]);
//$this->belongsToMany('Tickets', [
// 'foreignKey' => 'project_id',
// 'targetForeignKey' => 'ticket_id',
// 'joinTable' => 'projects_tickets'
//]);
$this->belongsToMany('Tickets', [
'through' => 'ProjectTickets',
]);
$this->belongsToMany('Users', [
'foreignKey' => 'project_id',
'targetForeignKey' => 'user_id',
'joinTable' => 'projects_users'
]);
}
}
票务表:
class ProjectsTicketsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('projects_tickets');
$this->displayField('project_id');
$this->primaryKey(['project_id', 'ticket_id']);
//$this->belongsTo('Projects', [
// 'foreignKey' => 'project_id',
// 'joinType' => 'INNER'
//]);
//$this->belongsTo('Tickets', [
// 'foreignKey' => 'ticket_id',
// 'joinType' => 'INNER'
//]);
$this->belongsTo('Projects');
$this->belongsTo('Users');
}
}
class TicketsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('tickets');
$this->displayField('title');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
//$this->belongsToMany('Projects', [
// 'foreignKey' => 'ticket_id',
// 'targetForeignKey' => 'project_id',
// 'joinTable' => 'projects_tickets'
//]);
$this->belongsToMany('Projects', [
'through' => 'ProjectTickets',
]);
$this->belongsToMany('Comments', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'comment_id',
'joinTable' => 'tickets_comments'
]);
$this->belongsToMany('Users', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'user_id',
'joinTable' => 'tickets_users'
]);
}
}
我是否在关联或查询方面有什么地方做错了,可以修复
编辑:通过更改关联(如提供的链接NDM),我成功地消除了“无关联错误”,但是所有试图组合表中的列的查询都会得到0个结果
例如,此搜索应返回所有票证(因为所有票证都在ProjectsTickets表中),但未返回任何内容:
$ownerQuery = $searchQuery
->innerJoinWith(
'Projects.ProjectsTickets', function($q) use( &$userId){
return $q->where(['Tickets.id' => 'ProjectsTickets.ticket_id']);
//->where(['Projects.id' => 'ProjectsTickets.project_id'])
//->where(['Projects.user_id' => $userId]);
}
);
但是,如果我只取消注释用户行,它将正确显示所有结果
编辑2:虽然关联解决方案有效,但匹配的解决方案没有问题。例如,如果我想在不必在票证和投影仪之间建立关联的情况下执行此查询:
$adminQuery = $searchQuery
->distinct()
->matching('ProjectsUsers')
->where([
'Tickets.id = ProjectsTickets.ticket_id',
'ProjectsTickets.project_id = ProjectsUsers.project_id',
'ProjectsUsers.user_id' => $userId,
'ProjectsUsers.role = Admin'
]);
这仍然导致
票证与投影仪不关联。在我看来,投影仪的问题与此相同。请注意,innerJoinWith()
的工作原理与matching()
类似,唯一的区别是匹配不会包含在结果中。@ndm嘿,我尝试过了,没有匹配的错误消失了,但是现在查询没有返回任何结果,所以我认为我仍然在这里做错了什么。哦,哇,我发现了,如果你想比较两列,有一种不同的语法。你会得到各种各样的新东西。。。正如链接答案中提到的,您无法以这种方式在联接表上进行匹配。仔细看一看代码示例,它与实际存在的关联相匹配,并且连接表是以这种方式自动包含的。然而,更干净的方法是创建一个额外的关联。