gpt4 book ai didi

laravel - Eloquent ORM 在多对多关系中加载不同的记录

转载 作者:行者123 更新时间:2023-12-05 01:07:32 26 4
gpt4 key购买 nike

背景

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

问题

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

我的尝试

我用过 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();

最佳答案

通过加入检索唯一订阅者

我会尽量用 Lists 来解释它而不是 Adressbook ,因为我无法真正理解您的模型,这可能会引起进一步的困惑。

如果我正确理解了您的评论,那么您正在尝试检索与 id IN listarray 列表有关联的所有唯一订阅者。 .在这种情况下,Eager Loading 不是正确的方法。 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 的行为是这样的:
  • 获取所有 lists .
  • 遍历 lists构建独特的阵列list_ids
  • 获取所有 list_subscribers使用 WHERE list_id IN (X, Y, Z)
  • 遍历所有 list_subscribers构建独特的阵列subscriber_id
  • 获取所有 subscribers使用 WHERE id IN (X, Y, Z)
  • 关于laravel - Eloquent ORM 在多对多关系中加载不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403135/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com