Eloquent ORM - 检索与给定模型无关的模型(多对多关系)

4
所以,我可以这样急切加载:
$subscribers = Subscriber::with('lists')->get();

现在我已经稳妥无比了。但是现在我想做的事情,在英语中应该是:

$non_subscribers = Subscriber::without('thislist')->get();

希望这样可以更好地传达我的目的。我可以执行两个查询,首先获取所有订阅者(属于此列表),然后再检索所有订阅者; 然后从中减去一个。

我的问题是:是否可能像上面的普通英语一样优雅地完成它?

谢谢你


with 方法会预加载订阅者的列表关系。因此,without 方法不会预加载(逻辑上)。它就像从未调用 with 方法一样。您正在寻找的是 has 方法的反向操作(返回具有给定关系的关系)。不幸的是,我认为这在 eloquent 中没有可能。 - Atrakeur
谢谢,我不得不咬紧牙关,想出了一个两步解决方案。如果有人需要的话,我会将其包含在答案中。 - kJamesy
2个回答

3

您还可以使用不太为人知的whereDoesntHave方法:

$subscribers = Subscriber::whereDoesntHave('lists', function ($query) use ($id) {
    $query->whereId($id);
})->get();

甚至可以是您原始答案的简化版本:
$subscribers = Subscriber::whereNotIn('id', $list->subscribers->lists('id'));

2

好的,如果您有更好的解决方案,请告诉我们。目前,这个方案可以解决问题:

    $list = Addressbook::with('subscribers')->find($id);
    $subscribers = '';

    if ($list->subscribers->count() > 0)
    {
        $subs_array = array();

        foreach ($list->subscribers as $list_subscriber) 
        {
            $subs_array[] = $list_subscriber->id;
        }

        $subscribers = Subscriber::whereNotIn('id', $subs_array)->get(); //the clever bit
    }

    else
    {
        $subscribers = Subscriber::get();
    }


    return Response::json($subscribers);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接