Cakephp-查找没有关联记录的记录

Cakephp-查找没有关联记录的记录,cakephp,inner-join,Cakephp,Inner Join,好的,我有这个: $user_id = AuthComponent::user('id'); $joins = [ ['table' => 'subscriptions', 'alias' => 'Subscription', 'type' => 'INNER', 'conditions' => [ 'Subscription.thread_id = T

好的,我有这个:

$user_id = AuthComponent::user('id');
$joins = [
        ['table' => 'subscriptions',
            'alias' => 'Subscription',
            'type' => 'INNER',
            'conditions' => [
                'Subscription.thread_id = Thread.id',
                'Subscription.user_id = '.$user_id
            ]
        ]
    ];

    $unsubscribed = $this->Thread->find('all',[
        'contain' => [
            'Subscription' => ['conditions' => ['Subscription.user_id' => $user_id]]
        ],
        'joins' => $joins,
        'fields' => ['name','modified'],
        'limit' => 10
    ]);

    debug($unsubscribed);
它基本上会找到所有附加到当前用户的订阅线程。 但我真正想要的是消极的结果。或者换句话说:当前用户没有订阅的所有线程?
有没有办法使条件变为负值?或者类似的情况?

假设您的关系是:

  • 线程有很多订阅
  • 订阅属于线程
您的SQL应该是:

SELECT Thread.*
FROM threads AS Thread
LEFT JOIN subscriptions AS Subscription
  ON Thread.id = Subscription.thread_id
    AND Subscription.user_id = ##user_id##
WHERE Subscription.user_id IS NULL;
关键的概念是需要左连接,而不是内部连接。此SQL将所有线程连接到用户的所有订阅,并且不会删除那些没有订阅的线程行(即,左连接的目的)。然后只选择没有订阅的记录(如WHERE子句中所示)

转换为Cakephp:

$user_id = AuthComponent::user('id');
$joins = [
    ['table' => 'subscriptions',
        'alias' => 'Subscription',
        'type' => 'LEFT',
        'conditions' => [
            'Subscription.thread_id = Thread.id',
            'Subscription.user_id = '.$user_id
        ]
    ]
];

$unsubscribed = $this->Thread->find('all',[
    'conditions' => ['Subscription.user_id' => null],
    'joins' => $joins,
    'fields' => ['name','modified'],
    'limit' => 10
]);

debug($unsubscribed);

那“Subscription.user\u id!=”呢$
$joins中的user_id
听起来不错,但我无法让它工作。我想您的意思是:“条件”=>[“Subscription.user\u id=!”=>$user\u id],但这也不起作用。它只返回一个空数组。我确实检查了是否存在有效的结果。
'conditions'=>['Subscription.user\u id'=>null]
应该在Subscription.user\u id为null的地方生成