#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, и это не приведет к ошибке. Большое вам спасибо за потраченное время!