【问题标题】:Is it possible to apply condition inside the map function of Laravel?是否可以在 Laravel 的 map 函数中应用条件?
【发布时间】:2021-04-04 02:19:38
【问题描述】:

我想在 foodOrders 中应用一些条件。是否可以在 map 函数中应用条件作为 $foodOrder->foodOrders->where('invoice_id',null)->get();

 public function getTableList(Request $request){
    $skip =$request->skip;
    $limit=$request->limit;
    $totaltable = Table::get()->count();

    $table = Table::skip($skip)->take($limit)->orderBy('id', 'DESC')->get();
    $table->map(function($foodOrder){
        $foodOrder->foodOrders;
    });
}

以下是此查询返回的输出。但我只想要带有空 invoice_id 的数据

{
  "success": true,
  "message": "Lists of Table.",
  "data": [
    {
      "id": 2,
      "table_number": "TN02",
            "food_orders": [
        {
          "id": 16,
          "food_items_id": 1,
          "table_id": 2,
          "invoice_id": null,
          "quantity": 2,
          "price": "2000.00"
         },
        {
          "id": 17,
          "food_items_id": 2,
          "table_id": 2,
          "invoice_id": null,
          "quantity": 3,
          "price": "150.00"
        }
      ]
    },
    {
      "id": 1,
      "table_number": "TN01",
      "created_at": "2020-10-25 10:44:31",
      "updated_at": "2020-10-25 10:44:31",
      "food_orders": [
        {
          "id": 14,
          "food_items_id": 1,
          "table_id": 1,
          "invoice_id": 39,
          "quantity": 1,
          "price": "2000.00"
        }
      ]
    }
  ]
}

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-4


    【解决方案1】:

    我认为您需要使用filter 而不是map。还是我错了?

    【讨论】:

      【解决方案2】:

      不是最好的方法,但这应该可以解决问题

      $table->map(function($foodOrder){
          $foodOrder->foodOrders=$foodOrder->foodOrders()->where('invoice_id',null)->get();
      });
      

      注意范围,你需要它们来应用 where 条件。我们说=,所以进一步的变化被传播。

      【讨论】:

        【解决方案3】:

        您可以过滤掉 food_orders 的白名单记录。

        $table->map(function($record){
            $record->food_orders = collect($record->food_orders)
                ->filter(fn($foodOrder) => is_null($foodOrder->invoice_id));
        
           return $record;
        });
        

        从上面显示的输出数据来看,food_orders 似乎是模型上的一个 hasMany 关系,因此在急切加载时很容易过滤掉该关系

        假设 Table 模型具有为 food_orders 定义的关系

        class Table extends Model
        {
            public function food_orders()
            {
                return $this->hasMany(FoodOrder::class);
            }
        
            //... rest of the class code
        }
        

        预加载时可以约束相关模型

        
        $table = Table::with([
                'food_orders' => fn($query) => $query->whereNull('invoice_id')
            ])
            ->skip($skip)
            ->take($limit)
            ->orderBy('id', 'desc')
            ->get();
        

        【讨论】:

          猜你喜欢
          • 2021-09-02
          • 2022-07-20
          • 2014-11-19
          • 2021-07-18
          • 2021-09-18
          • 2012-10-05
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          相关资源
          最近更新 更多