4

背景

我有一个列表模型,它属于并有很多订阅者。当然还有一个订阅者,它属于并拥有许多列表。

问题

我想从多个列表中急切加载所有订阅者。但是,我只对不同的订阅者感兴趣,因为订阅者可以拥有并且确实属于多个列表。

我的尝试

我已经使用了这种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();
4

1 回答 1

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.*'));

急切加载

如果只是为了提高性能,你不需要使用 distinct,Laravel 已经做到了。Eloquent 的行为如下:

  1. 获取所有lists.
  2. 迭代lists构建一系列独特的list_ids
  3. 获取所有list_subscribers使用WHERE list_id IN (X, Y, Z)
  4. 遍历所有list_subscribers构建一个独特的数组subscriber_id
  5. 获取所有subscribers使用WHERE id IN (X, Y, Z)
于 2013-08-23T12:52:31.180 回答