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嘿,我尝试过了,没有匹配的错误消失了,但是现在查询没有返回任何结果,所以我认为我仍然在这里做错了什么。哦,哇,我发现了,如果你想比较两列,有一种不同的语法。你会得到各种各样的新东西。。。正如链接答案中提到的,您无法以这种方式在联接表上进行匹配。仔细看一看代码示例,它与实际存在的关联相匹配,并且连接表是以这种方式自动包含的。然而,更干净的方法是创建一个额外的关联。