Невозможно выполнить foreach в коллекции, определенной с помощью дополнительной переменной pivot — Laravel 5.4

Я просто не могу получить список моделей в коллекции. Кажется, это простая проблема, но я просто не могу угадать правильное решение.

У меня есть сводная таблица с 3 внешними ключами:

TABLE leadsupplier_product

id | lead_id | supplier_id | product_id

4  |  128    |  2048       |  8
3  |  120    |  2048       |  7
4  |  120    |  2048       |  8

В моей модели «Поставщик» я определил это соотношение:

public function products()
{
// ->where('leadsupplier_product.lead_id', $leadid)
return $this->belongsToMany(\App\Models\Product::class, 'leadsupplier_product', 'supplier_id', 'product_id')->withPivot('lead_id','id');
}

Что я пытаюсь получить:

В заданном шаблоне отведений я хочу переключаться между моделями с foreach петля

Так в шаблоне для $ lead = 120;
У меня есть это:

подсчет

{{$o->products()->wherePivot('lead_id', $lead->id)->count()}}

и работает как положено (получаю правильное количество моделей)

// no `()` after the relation name
{{$o->products->wherePivot('lead_id', $lead->id)->count()}}

я получил ErrorException in Macroable.php line 74: Method wherePivot does not exist. Зачем?

foreaching

Но по моему foreach Я не смог распечатать коллекцию:

// no objects printed
@foreach($o->products()->where('leadsupplier_product.lead_id', $lead->id) as $ps)
<a class="btn btn-sm bg-greenish">abc {{$ps->id}} </a>
LbyP:{{$ps->pivot->lead_id}} LS: {{$ps->pivot->id}}   L:{{$lead->id}}
@endforeach

// no objects printed
@foreach($o->products()->wherePivot('lead_id', $lead->id) as $ps)
<a class="btn btn-sm bg-greenish">abc {{$ps->id}} </a>
LbyP:{{$ps->pivot->lead_id}} LS: {{$ps->pivot->id}}   L:{{$lead->id}}
@endforeach

Теперь, если я определю отношение с параметром

public function productsThisLead($leadid)
{
return $this->belongsToMany(\App\Models\Product::class, 'leadsupplier_product', 'supplier_id', 'product_id')->withPivot('lead_id','id')->where('leadsupplier_product.lead_id', $leadid);
}// I get no results in the `foreach` loop
@foreach($o->productsThisLead($lead->id) as $ps)

<a class="btn btn-sm bg-greenish">abc {{$ps->id}} </a>
LbyP:{{$ps->pivot->lead_id}} LS: {{$ps->pivot->id}}   L:{{$lead->id}}

@endforeach

Помогите!

Что мне нужно

  • Как я могу передать переменную в отношение, определенное в модели?
  • или просто как определить отношение, чтобы оно выводило коллекцию?

Мое грязное решение

Я просто добавляю лишнюю @if состояние внутри цикла

  @foreach($o->products as $ps)
@if($ps->pivot->lead_id == $lead->id)
<a class="btn btn-sm bg-greenish">abc {{$ps->id}} </a>
LbyP:{{$ps->pivot->lead_id}} LS: {{$ps->pivot->id}}   L:{{$lead->id}}
@endif
@endforeach

0

Решение

Две части к вашему вопросу …

Первая часть..

{{$o->products()->wherePivot('lead_id', $lead->id)->count()}}
and it works as expected (I get the proper number of models)

// no `()` after the relation name
{{$o->products->wherePivot('lead_id', $lead->id)->count()}}
I get ErrorException in Macroable.php line 74: Method wherePivot does not exist. Why?

Когда вы вызываете отношение без (), оно пытается вернуть значение отношения … Когда вы вызываете его с помощью (), оно возвращает объект построителя запросов, на котором вы можете продолжить строить … как вы делаете …

Теперь, когда это делается, это должен быть полный оператор построителя запросов … не подделывайте -> get () … вот так … Это должно сработать …

$o->products()->wherePivot('lead_id', $lead->id)->get()

Это вернет коллекцию, которую вы ищете …

Надеюсь это поможет

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector