Laravel 5.8: Получение Названия Продукта, Связанного С Деталями Заказа

#php #laravel #laravel-5.8

Вопрос:

У меня есть этот метод в контроллере:

 public function prnpriview(Request $request)
    {
        if(!empty($request->input('actions'))){
            if($request->input('actions')=='print_factors'){
                if(!empty($request->input('orderCheck'))) {
                    $args = [];
                    $orders = $request->input('orderCheck');
                    foreach ($orders as $ord){
                        $order = Order::find($ord);
                        $args[] = [
                            'order' => $order,
                            'address' => $order->order_address->first(),
                            'details' => $order->orderDetail,
                            'sendType' => $order->productSubmit,
                            'coupons' => $this->cartController->computeDiscountForOutRequests($order->ord_object_id, $order->ord_creator_id),
                            'user' => User::query()->find($order->ord_creator_id)
                        ];
                    }

                    return view('admin.shop.orders.printfactors', compact('args'));
                }else{
                    return back();
                }
           }
     }
}
 

Затем printfactors.blade.php я добавил это , чтобы получить details информацию, которая на самом деле связана с orderDetail моделью:

 @foreach($args as $arg)
    @forelse($arg['details'] as $detail)
    <tr>
        <td style="text-align: center;">{{optional(($detail)->ort_reference_id)->prd_name }}</td>
    </tr>
    @empty
    @endforelse
@endforeach
 

Но я не понимаю prd_name , что связано с порядком. Это означает, что он пуст. Тем не менее, у меня есть этот продукт за products столом:

введите описание изображения здесь

А вот prd_id внешний ключ, связанный с ort_reference_id order_detail таблицей:

Модель заказа ( OrderDetail.php ):

 public function product()
    {
        return $this->belongsTo(Product::class, 'ort_reference_id', 'prd_id');
    }
 

И когда я dd($detail->ort_reference_id) вхожу printfactors.blade.php , я получаю 2 в результате, поэтому он должен печатать prd_name , связанный с этим заказом, который Book приведен в этом примере.

Итак, что здесь происходит не так, как я могу правильно отображать название продукта на printfactors.blade.php основе каждого заказа?

Ответ №1:

Вы можете позвонить вот так optional($detail->product)->prd_name

Полный код

 @foreach($args as $arg)
    @forelse($arg['details'] as $detail)
    <tr>
        <td style="text-align: center;">{{optional($detail->product)->prd_name }}</td>
    </tr>
    @empty
    @endforelse
@endforeach
 

или

   @foreach($args as $arg)
        @forelse($arg['details'] as $detail)
        <tr>
            <td style="text-align: center;">{{$detail->product->prd_name??null }}</td>
        </tr>
        @empty
        @endforelse
    @endforeach
 

Ответ №2:

Прежде всего потому, что вы не используете стандартный первичный ключ для таблицы, поэтому для правильной работы связи с продуктом вам необходимо указать первичный идентификатор в модели продукта.

 protected $primaryKey = 'prd_id';
 

По умолчанию Laravel примет имя основного столбца таблицы либо id product_id

После этого вы можете легко использовать дополнительную функцию для получения свойства prd_name, если запись существует, в противном случае она вернет значение null.

 optional($detail->product)->prd_name;
 

или вы можете использовать тернарный оператор для проверки значения

 $detail->product ? $detail->product->prd_name : '';
 

Ответ №3:

Вы можете получить название продукта как-

 optional($detail->product)->prd_name
 

В виде реляционных данных, доступных с именем функции.

Ответ №4:

Вы можете просто назвать продукт по модели вашего заказа, как показано ниже:

 <td style="text-align: center;">{{optional($detail->product)->prd_name?? '' }}</td>