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

时间:2013-08-14 12:42:19

标签: laravel laravel-4 eloquent

所以,我可以急切地加载:

$subscribers = Subscriber::with('lists')->get();

我回家干了。 但是现在我想用英语做什么:

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

这并不能很好地阅读,但希望它有助于传达我的目标。我可以做两个查询,首先获得所有拥有(并且属于)此列表的订阅者,然后再获取另一个订阅者以检索所有订阅者;然后从另一个中减去一个。

我的问题:是否有可能像上面那样用简单的英语说它呢?

感谢你

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

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

甚至是原始答案的简化版本:

$subscribers = Subscriber::whereNotIn('id', $list->subscribers->lists('id'));