【问题标题】:Load laravel model where relationship has condition加载关系有条件的 laravel 模型
【发布时间】:2017-07-26 22:40:19
【问题描述】:

我想知道如何加载满足特定条件的类型的所有模型。
让我们采用以下示例设置。 我有 2 个雄辩的模型,HouseRentalHouseRentalhasMany 关系。

public function rentals()
{
    return $this->hasMany(Rental::class);
}

Rental 类有一个 review 列,该列可以具有以下值:positivenegative

现在我想“覆盖”默认查询构建器,可以使用:

public function newQuery($excludeDeleted = true) {
    return parent::newQuery($excludeDeleted);
}

注意:这不会改变默认行为。

我想知道如何更改默认的 House 查询以仅返回至少具有任意数字 (x) Rentalsreview 等于 @ 的 House 实例987654336@.

所以House::all() 应该只返回Houses 至少有x positive Rentals

如果您还可以解释如何添加另一个可用于查询所有Houses的函数,则可以加分

我的问题似乎与 Laravel 的 softDeletes 特征有很多共同点,softDeletes 模型只查询 deleted_at 列不为空的模型。我的问题的额外部分可以看作是查询中的::withTrashed() 选项。
该应用程序基于 Laravel 5.4 构建。

【问题讨论】:

  • 在您的House::all() 示例中,x 的值在哪里确定?

标签: laravel eloquent relationship


【解决方案1】:

您想使用whereHas 加载满足特定条件的房屋。

$houses = House::whereHas('rentals', function($q) {
    $q->where('review', 'positive');
}, '>=', $x)->get();

这里,$x 是房子在出现之前必须获得的好评数。

它非常简单,所以我不确定它是否仍然可以将此条件添加为默认值,因为您有时也希望能够删除默认值。也许更好的解决方案是将它放在House 模型中的一个函数中,您可以重复使用它而不必担心它会默认工作。

【讨论】:

  • 这已经很好用了,我要求使用默认实现,因为项目变得相当大并且positive rentals 用于超过90%的情况,我认为代码更清晰,并且如果这是处理它的默认方式,则可读性更好。尽管为实现此代码的房屋添加范围也很有效。
  • 请记住,whereHas 不会急于加载,因此除非您还向其中添加 with('rentals'),否则您将面临 1+n 问题,假设您正在尝试循环遍历每个房子的rentals
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多