Laravel 5.8: 尝试获取 属性 'order' 的非对象
Laravel 5.8: Trying to get property 'order' of non-object
我正在开发一个 Laravel 5.8 项目,它是一个在线商店。在这个项目中,我想为管理员添加“打印顺序因素”功能。
所以我做了一个这样的表格:
<form method="POST" action="{{ route('orders.newprint') }}">
@csrf
@forelse($orders as $order)
<tr>
<td><input class="form-check-input" name="orderCheck[]" type="checkbox" value="{{ $order->ord_id }}"> </td>
<td>{{ $order->ord_id }}</td>
<td>{{ $order->status_label }}</td>
<td>{{ $order->customer_name }}</td>
<td>{{ $order->ord_total }}</td>
</tr>
@empty
<td colspan="7" class="text-center">No order to show</td>
@endforelse
</form>
所以基本上管理员可以 select 多个这样的订单:
我正在尝试将订单 ID 作为数组发送:
<input class="form-check-input" name="orderCheck[]" type="checkbox" value="{{ $order->ord_id }}">
所以点击打印所有订单因素后,应该会在一页上显示所有订单因素。
因此,为了做到这一点,我在控制器中添加了这个方法:
public function prnpriview(Request $request)
{
$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.newprint', compact('args'));
}
然后在 Blade,我尝试了这个:
@foreach($args as $arg)
<p>Buyer Name:
<strong>
{{ $arg->order->customer_name }}
</strong>
</p>
<p>Address:
<strong>
{{ $arg->address->province_relation->prv_name }}،
{{ $arg->address->city_relation->cit_name }}،
{{ $arg->address->address }}
</strong>
</p>
...
@endforeach
但是我得到这个错误:
Trying to get property 'order' of non-object (View: newprint.blade.php)
在您的控制器中,您正在形成 $args
作为多维数组而不是对象数组。
所以在你看来你应该使用数组语法。
即:
@foreach($args as $arg)
{{ $arg['order']->customer_name }}
{{ $arg['address']->province_relation->prv_name }}،
// ... and so
@endforeach
感谢您的建议,这部分可以改进:
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)
];
}
您可以只在循环外使用 find()
来降低时间复杂度。由于 find()
接受 array
作为 Laravel 核心中的参数:
src/Illuminate/Database/Eloquent/Builder.php
public function find($id, $columns = ['*'])
{
if (is_array($id) || $id instanceof Arrayable) {
return $this->findMany($id, $columns);
}
return $this->whereKey($id)->first($columns);
}
所以你可能想要这样的东西:
$order = Order::find($request->input('orderCheck'));
foreach($orders as $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)
];
}
现在复杂度是 O(n)
,而不是我想的 O(n^2)
。
我正在开发一个 Laravel 5.8 项目,它是一个在线商店。在这个项目中,我想为管理员添加“打印顺序因素”功能。
所以我做了一个这样的表格:
<form method="POST" action="{{ route('orders.newprint') }}">
@csrf
@forelse($orders as $order)
<tr>
<td><input class="form-check-input" name="orderCheck[]" type="checkbox" value="{{ $order->ord_id }}"> </td>
<td>{{ $order->ord_id }}</td>
<td>{{ $order->status_label }}</td>
<td>{{ $order->customer_name }}</td>
<td>{{ $order->ord_total }}</td>
</tr>
@empty
<td colspan="7" class="text-center">No order to show</td>
@endforelse
</form>
所以基本上管理员可以 select 多个这样的订单:
我正在尝试将订单 ID 作为数组发送:
<input class="form-check-input" name="orderCheck[]" type="checkbox" value="{{ $order->ord_id }}">
所以点击打印所有订单因素后,应该会在一页上显示所有订单因素。
因此,为了做到这一点,我在控制器中添加了这个方法:
public function prnpriview(Request $request)
{
$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.newprint', compact('args'));
}
然后在 Blade,我尝试了这个:
@foreach($args as $arg)
<p>Buyer Name:
<strong>
{{ $arg->order->customer_name }}
</strong>
</p>
<p>Address:
<strong>
{{ $arg->address->province_relation->prv_name }}،
{{ $arg->address->city_relation->cit_name }}،
{{ $arg->address->address }}
</strong>
</p>
...
@endforeach
但是我得到这个错误:
Trying to get property 'order' of non-object (View: newprint.blade.php)
在您的控制器中,您正在形成 $args
作为多维数组而不是对象数组。
所以在你看来你应该使用数组语法。
即:
@foreach($args as $arg)
{{ $arg['order']->customer_name }}
{{ $arg['address']->province_relation->prv_name }}،
// ... and so
@endforeach
感谢您的建议,这部分可以改进:
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) ]; }
您可以只在循环外使用 find()
来降低时间复杂度。由于 find()
接受 array
作为 Laravel 核心中的参数:
src/Illuminate/Database/Eloquent/Builder.php
public function find($id, $columns = ['*'])
{
if (is_array($id) || $id instanceof Arrayable) {
return $this->findMany($id, $columns);
}
return $this->whereKey($id)->first($columns);
}
所以你可能想要这样的东西:
$order = Order::find($request->input('orderCheck'));
foreach($orders as $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)
];
}
现在复杂度是 O(n)
,而不是我想的 O(n^2)
。