Laravel: Попытка получить доступ к смещению массива при значении типа null

#php #laravel

Вопрос:

В настоящее время я работаю над системой продаж, у каждого продукта будет несколько документов (PDF, документы, img, excel), а некоторые могут и не быть. Документы сгруппированы в одну папку, и кнопки встроены для пользователей, чтобы загрузить папку с документами (zip-загрузка). Пользователю необходимо сначала приобрести продукт, прежде чем загружать папку с документами.

Попытка доступа к смещению массива по значению типа null

Ошибка возникает, когда мне нужно получить доступ к странице сведений о продукте с помощью кнопки для загрузки папки с документами.

Контроллер продукта

 public function specific($id, Product $product) {  $product = Product::where('type', 2)-gt;findOrFail($id);   $document = Document::where('product_id', $product-gt;id)-gt;first(); //   return view('web.detail', compact('product', 'document')); }  

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

detail.blade.php

 lt;divgt;  // check if product has document  @if ( count($product-gt;product_document) gt; 0 )     lt;divgt;   lt;pgt;You can download the Fact Sheet below by clicking the button below.lt;/pgt;lt;brgt;   @auth   @php   use AppModelsOrder;   $orders = Order::where([  'member_id' =gt; Auth::user()-gt;profile-gt;member['id'],   'product_id' =gt; $document-gt;product_id  ])-gt;get();  @endphp     // check if user has purchased the product  @if (count($orders) gt; 0)   @foreach($orders as $order)  lt;div class="row"gt;  @if ($order['order_status'] === 3)   {{-- Paid --}}  lt;divgt;lt;a href="{!! route('web.download', $product-gt;id) !!}" class="btn-design"gt;  Downloadlt;/agt;  lt;/divgt;   @else   {{-- Unpaid --}}  lt;divgt;lt;a href="{{ route('web.order', $product-gt;id) }}" class="btn-design"gt;  Downloadlt;/agt;  lt;/divgt;   @endif  lt;/divgt;  @endforeach   @else   ...   @endauth   lt;/divgt;  @else   lt;divgt;lt;pgt;There is no Fact Sheet for this product yet.lt;/pgt;lt;/divgt;   @endif lt;/divgt;  

Product.php

 public function product_document() {  return $this-gt;hasMany(Document::class, 'product_id', 'id'); }  

Document.php

 public function product() {  return $this-gt;belongsTo(Product::class, 'product_id'); }  

Order.php

 public function product() {  return $this-gt;belongsTo(Product::class, 'product_id'); }  public function member() {  return $this-gt;belongsTo(Member::class, 'member_id'); }  

Любая помощь будет признательна!

Ответ №1:

Трудно сказать, откуда взялась ошибка, так как вы не указали трассировку стека или конкретный элемент, который был равен нулю. Но я предполагаю, что это притяжение может быть причиной проблемы:

 $orders = Order::where([  'member_id' =gt; Auth::user()-gt;profile-gt;member['id'],   'product_id' =gt; $document-gt;product_id ])-gt;get();  

В частности, эта часть: Auth::user()-gt;profile-gt;member['id']

Возможно, у вашего пользователя нет профиля. В этом случае он не может найти member['id'] , потому что есть нулевое значение, пытающееся вызвать значение массива.

Или, возможно, профиль не был загружен. Попробуйте загрузить его перед вызовом массива: Auth::user()-gt;loadMissing('profile'); ( loadMissing просто загружает связь, если она еще не была загружена.)

Незнание этих значений для пользователя или того, как они настроены, затрудняет это, но те же проблемы могут возникнуть и с member объектом-он может не быть установлен или не загружаться.

Чтобы проверить, попробуйте сбросить объект пользователя на разных уровнях (просто пользователь, затем с профилем, затем с участником) и посмотрите, что вернется. Это будет довольно быстрый индикатор того, где находится нулевое значение.

Комментарии:

1. Я понял, Auth::user()-gt;profile-gt;member['id'] это значение равно нулю, потому что пользователь еще не является участником. Таким образом, я использую @if (!empty($orders)) вместо подсчета заказов @if (count($orders) gt; 0) в файле blade, и это не приведет к ошибке. Большое вам спасибо за потраченное время!