背景
我有一个List模型,它属于并拥有许多订阅者。当然还有一个属于并拥有许多List的订阅者。
问题
我想从多个列表中急切加载所有订阅者。但是,我只对不同的订阅者感兴趣,因为订阅者可以拥有并且确实属于多个列表。
我的尝试
我使用了distinct()
方法,但这并没有产生任何乐趣。我也可以遍历结果集来手动切出重复项。只是想知道是否有办法让Laravel为我做肮脏的工作?
代码
$lists = Input::get('listsarray');
$addresses = Addressbook::with(array('subscribers' => function($query)
{
$query->where('active', '=', 1);
// $query->distinct(); //This didn't work
}))->whereIn('id', $lists)->get();
答案 0 :(得分:5)
我会尽量使用Lists
而不是Adressbook
来解释它,因为我无法理解您的模型,这可能会引起进一步的混淆。
如果我正确理解了您的评论,那么您正在尝试检索与id IN listarray
列表关联的所有唯一订阅者。在这种情况下,Eager Loading不是正确的方法。预先加载用于预加载模型的关联,以便稍后使用它们。在您的情况下,您不会检索Lists
及其Subscribers
,而是检索唯一的Subscribers
。
$lists = Input::get('listsarray');
$subscribers = Subscriber::join('list_subscriber', 'list_subscriber.subscriber_id', '=', 'subscribers.id')
->whereIn('list_subscriber.list_id', $lists)
->groupBy('list_subscriber.subscriber_id')
->get(array('subscribers.*'));
如果您还希望检索与此类订阅者关联的所有列表,您可以这样做:
// Simply include a with('lists') and Eloquent will eager load them
$subscribers = Subscriber::with('lists')
->join('list_subscriber', 'list_subscriber.subscriber_id', '=', 'subscribers.id')
->whereIn('list_subscriber.list_id', $lists)
->groupBy('list_subscriber.subscriber_id')
->get(array('subscribers.*'));
如果只是改善性能,你不需要使用不同的,Laravel已经做到了。 Eloquent的行为如下:
lists
。lists
构建一个独特的list_ids
list_subscribers
WHERE list_id IN (X, Y, Z)
list_subscribers
构建一个独特的subscriber_id
subscribers
WHERE id IN (X, Y, Z)
醇>