使用Eloquent选择关系计数为零的所有记录?

Rea*_*ues 2 php mysql sql laravel eloquent

用简单的英语:我有三张桌子.subscription_type有很多email_subscriptions有很多emails.

我想选择所有email_subscription具有特定记录subscription_type,也没有任何相关的email记录中有一个statusHeld.

我坚持的特定位只返回email_subscriptionsemails(在上面描述的附加的where子句).

使用Eloquent,我已经能够得到一些方法,但我不知道如何选择关系计数为零的所有记录:

$subscriptionsWithNoCorrespondingHeldEmail = EmailSubscriptions::whereHas('subscriptionType', function($q) {
            $q->where('name', 'New Mission');
        })-; // What do I chain here to complete my query?
Run Code Online (Sandbox Code Playgroud)

另外,Eloquent甚至可以实现这一点,还是需要使用Fluent语法?

use*_*930 6

您可以使用该has()方法查询关系存在:

has('emails', '=', 0)
Run Code Online (Sandbox Code Playgroud)

例如:

$tooLong = EmailSubscriptions::whereHas('subscriptionType', function($q) {
    $q->where('name', 'New Mission');
})->has('emails', '=', 0)->get();
Run Code Online (Sandbox Code Playgroud)

编辑

您可以使用whereHas()whereDoesntHave()方法执行更高级的查询:

$tooLong = EmailSubscriptions::whereHas('subscriptionType', function($q) {
    $q->where('name', 'New Mission');
})
->whereDoesntHave('emails', function ($query) {
    $query->where('status', '=', 'whatever');
})->get();
Run Code Online (Sandbox Code Playgroud)