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 }}">&nbsp;</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)