#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>