Laravel красноречивый запрос, где вложенные отношения

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

Я новичок в laravel и пытаюсь написать запрос, в котором для получения соответствующего результата передается выбранный stock->OrderProduct->product_id. Запрос выглядит следующим образом :

 $stock = Stock::where('orderProductid.product_id', $pharmacyEvent->prescription->product_id)
                ->whereHas('orderProduct.product.prices')
                ->with(['orderProduct.product.price' => function ($query) use ($paymentMode) {
                    $query->where('scheme_id', $paymentMode->scheme_id);
                }])->first();

            $price = $stock->orderProduct->product->price;
 

Это не работает, так как это плохая практика, и я переписал запрос, как показано ниже, что приводит к неправильным результатам.

 $stock = Stock::whereHas('orderProduct.product.prices')
        ->with([
            'orderProduct.product' => function ($query) {
                $query->where('id', $pharmacyEvent->prescription->product_id);
            },
            'orderProduct.product.price' => function($query) {
                $query->where('scheme_id', $paymentMode->scheme_id);
            }
        ])->first(); 
 

Любые рекомендации по использованию красноречивых методов, когда я хочу передать условие, основанное на отношениях в запросе, будут высоко оценены. Я использую lavel 5.8

Ответ №1:

Я использовал whereHas :

 $stock = Stock::whereHas('orderProduct.product', function($query) use ($pharmacyEvent) {
                    $query->where('id', $pharmacyEvent->prescription->product_id);
                })    
               // ->whereHas('orderProduct.product.prices')
                ->with(['orderProduct.product.price' => function ($query) use ($paymentMode) {
                    $query->where('scheme_id', $paymentMode->scheme_id);
                }])->first();

            $price = $stock->orderProduct->product->price;