【问题标题】:Laravel query for hiding records on a booleanLaravel 查询隐藏布尔值的记录
【发布时间】:2021-02-24 07:49:46
【问题描述】:

我正在尝试编写一个查询,列出purchased = true 所在的所有产品。如果产品将字段 includes_bonus 设置为 true,则应在刀片上隐藏 ID 为 2 的奖励产品。

用例:

如果 includes_bonus 在任何产品记录上设置为 1,则始终隐藏 id 为 2 的产品。如果 includes_bonus 在所有记录上为 0,则始终显示 id 为 2 的产品。

当前查询

下面是我创建的查询,问题是当您关闭 includes_bonus 设置为 true 的产品,然后单独打开 id 为 2 的产品时,它会隐藏该记录。

$purchasedProducts = $user->products()->where('purchased', 1);
        if ($user->products()->where('includes_bonus', '=', 1)->first()) {
            $purchasedProducts->where('products.id', '!=', 2);
        }
        $purchasedProducts = $purchasedProducts->get();

刀片foreach

然后我计划遍历每条记录并将其显示在页面上

 @foreach($purchasedProducts as $purchasedProduct)

如何修改此查询以确保当includes_bonus 为真且始终显示其假时,产品 id 2 始终隐藏?

【问题讨论】:

  • 因此,如果$purchasedProducts 中任何产品上的includes_bonus 为1,则隐藏记录2 ...如果includes_bonus 未在任何产品上设置为1,则显示记录?您可以获取所有记录,然后根据需要过滤掉记录 2
  • 是的,这就是我需要的。我一直看到建议的过滤,但我不知道如何将它应用到我的用例中,您介意为我提供一个示例/答案吗?

标签: laravel if-statement foreach eloquent laravel-blade


【解决方案1】:

您可以获取所有记录,然后查看它们是否包含此特定条件,如果是,则获取没有 id 2 的集合:

$purchasedProducts = $user->products()->where('purchased', 1)->get();

if ($purchasedProducts->contains('includes_bonus', 1)) {
    $purchasedProducts = $purchasedProducts->except(2);
}

Laravel 8.x Docs - Collections - Available Methods - contains

Laravel 8.x Docs - Eloquent Collections - Available Methods - except

【讨论】:

  • 酷,如果我在函数底部返回视图时将变量传递给刀片,它会考虑这个语句吗?或者我是否需要修改我通过它的方式或在刀片中更改我的 foreach?
  • 在刀片视图中,您将拥有您的集合,您可以毫无顾虑地进行迭代,因为您已经在视图之前根据需要对其进行了更改
  • 好的,很酷,except 和关键参数例如 2 除了总是指向模型 ID 吗?
  • 因为它是一个Eloquent\Collection,它具有与模型的id 相关的特殊方法,所以except 在这种情况下采用了id ...但是试一试见
  • 啊,非常感谢您的知识,刚刚测试了它现在一切正常!谢谢你所有的帮助滞后!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2015-03-13
  • 2018-07-27
  • 1970-01-01
相关资源
最近更新 更多