Laravel - итерация сводных данных (свойство не существует в этом экземпляре коллекции) - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть отношение многие ко многим между Order и Product

Product.php

public function orders()
{
    return $this->belongsToMany(Order::class)
                ->withTimestamps()
                ->withPivot('qty');
}

Order.php

public function products()
{
    return $this->belongsToMany(Product::class)
                ->withTimestamps()
                ->withPivot('qty');
}

Теперь всякий раз, когда я пытаюсь использовать итерацию в представлении (в этом случае я просто пытаюсь показать форму, которая перебирает все доступные Product s, я всегда получаю ошибку ...

Property [products] does not exist on this collection instance.

create.blade.php

@foreach ($products->orders as $product)

# Order inputs are here

{{ Form::text('qty', $product->pivot->qty, [
                          'type' => 'tel',
                            'min' => 0,
                            'max' => 20,
                            'step' => 1,
                            'placeholder' => '0',
                            'class' => 'meal'
                            ]) }}
@endforeach

Я также попытался @foreach ($products->orders as $product), и оба подхода дают мне одну и ту же ошибку.

Я пытался разными способами в моем контроллере исправить эту ошибку, вотмоя последняя попытка:

OrderControlller.php

public function create()
{
    $user = Auth::user();
    $products = Product::get();
    $orders = $user->orders;

    return view('orders.create', compact('products', 'orders', 'user'));
}

ОБНОВЛЕНИЕ

@ ответ Алана правильный, я уверен, однако ...

Я все еще получаю сообщение «Свойство [сводная таблица] не существует в этом экземпляре коллекции» всякий раз, когда я пытаюсь запустить итерацию.

Концепция итерации внутри итерации в этом экземпляре сбивает с толкудля меня.

Я не могу представить, как Laravel обрабатывает поворотное соединение. В тинкере, когда я загружаю только Proтаблица воздуховодов, столбец qty отсутствует.(Это имеет смысл, потому что это находится на сводной таблице).Это также объясняет эту новую ошибку.

Должен ли я что-то делать в духе этого?:

изменено create.blade.php

@foreach ($products as $product)
 {{ Form::text('qty', $product->orders->pivot->qty }}

OrderController.php

$user = Auth::user();
$orders = $user->orders;
$products= []; #pass products to view as an array
$p = $orders->products; #this relationship brings in pivot data? 
foreach ($p as $orders) {
   #would I then somehow pass just this qty here?
}

Проблема в том, что я всегда получаю ошибку "Свойство не существует", будь то с'products', 'orders' или 'pivot'.

1 Ответ

0 голосов
/ 08 декабря 2018

Это должно работать.Вы пытались получить доступ к свойству orders в переменной $ products, которая является коллекцией Laravel (метод get для модели возвращает коллекцию).Поэтому вместо того, чтобы делать это, вы просто перебираете продукты и получаете доступ к сводной таблице из отдельной модели продукта.

@foreach ($products as $product)

# Order inputs are here

{{ Form::text('qty', $product->orders->pivot->qty, [
                          'type' => 'tel',
                            'min' => 0,
                            'max' => 20,
                            'step' => 1,
                            'placeholder' => '0',
                            'class' => 'meal'
                            ]) }}
@endforeach

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

OrderController.php

$user = Auth::user();
$user->load("orders.products"); // eager load relationship to avoid N+1 problem
$orders = $user->orders;
return view('orders.create', compact('orders', 'user'));

create.blade.php

@foreach ($orders as $order)
    @foreach ($order->products as $product)


    {{ Form::text('qty', $product->pivot->qty, [
                          'type' => 'tel',
                            'min' => 0,
                            'max' => 20,
                            'step' => 1,
                            'placeholder' => '0',
                            'class' => 'meal'
                            ]) }}
     @endforeach
@endforeach

Некоторые ресурсы:

Стремительная загрузка

Отношение ко многим ко многим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...