Я просто не могу получить список моделей в коллекции. Кажется, это простая проблема, но я просто не могу угадать правильное решение.
У меня есть сводная таблица с 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.
Зачем?
Но по моему 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
Две части к вашему вопросу …
Первая часть..
{{$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()
Это вернет коллекцию, которую вы ищете …
Надеюсь это поможет
Других решений пока нет …