Я работаю над проектом Laravel 9, и мне нужно показывать только те записи, где глубоко вложенные отношения имеют записи, в моем случае tiers
.
Мои отношения прямо сейчас все еще возвращают меня pingtree_entries
хоть tiers
пусты, чего мне не хватает?
Вот мой запрос верхнего уровня:
$pingtree = Pingtree::where('company_id', $company_id)
->where('id', $id)
->has('pingtree_entries.tiers')
->with('pingtree_entries.tiers')
->first();
Это должно говорить что-то вроде:
Получите мой
Pingtree
по идентификатору компании и идентификатору с моими уровнями, связанными с pingtree_entries для Pingtrees, где существует более 0 уровней.
Моя модель Pingtree определяет:
/**
* Get the pingtrees that the model has.
*/
public function pingtree_entries()
{
return $this->hasMany(PingtreeEntry::class);
}
Моя модель PingtreeEntry определяет:
/**
* Get the buyer tier that the model has.
*/
public function tiers()
{
return $this->hasMany(BuyerTier::class, 'id', 'buyer_tier_id');
}
Это выводит через Postman следующее:
{
"model": {
"id": 1,
"user_id": 1,
"company_id": 1,
"pick_chance": 4,
"name": "omnis iusto consequatur",
"description": "Hic nihil suscipit error.",
"is_enabled": false,
"created_at": "2023-01-27T14:15:26.000000Z",
"updated_at": "2023-01-27T14:15:26.000000Z",
"deleted_at": null,
"is_deleting": false,
"pingtree_entries": [
{
"id": 1,
"user_id": 1,
"company_id": 1,
"buyer_id": 2,
"buyer_tier_id": 4,
"pingtree_id": 1,
"pingtree_group_id": null,
"processing_order": 1,
"is_enabled": true,
"created_at": "2023-01-27T14:15:26.000000Z",
"updated_at": "2023-01-27T14:15:26.000000Z",
"deleted_at": null,
"tiers": [
{
"id": 4,
"user_id": 1,
"company_id": 1,
"buyer_id": 2,
"country_id": 2,
"product_id": 3,
"name": "dignissimos voluptas et",
"description": "Dolore tempora et maxime nam.",
"processing_class": "et",
"is_default": false,
"is_enabled": false,
"created_at": "2023-01-27T14:15:25.000000Z",
"updated_at": "2023-01-27T14:15:25.000000Z",
"deleted_at": null,
"is_deleting": false
}
]
},
{
"id": 3,
"user_id": 1,
"company_id": 1,
"buyer_id": null,
"buyer_tier_id": null,
"pingtree_id": 1,
"pingtree_group_id": 1,
"processing_order": 1,
"is_enabled": false,
"created_at": "2023-01-27T14:15:26.000000Z",
"updated_at": "2023-01-27T14:15:26.000000Z",
"deleted_at": null,
"tiers": []
}
]
}
}
Обратите внимание, что последний PingtreeEntry
не имеет уровней. Поэтому я вообще не хочу показывать всю PingtreeEntry
модель.
Попытка с whereHas
$pingtree = Pingtree::where('company_id', $company_id)
->where('id', $id)
->whereHas('pingtree_entries.tiers')
->with('pingtree_entries.tiers.buyer')
->first();
->whereHas('pingtree_entries.tier')
, добавленный в модель Pingtree
, по-прежнему возвращает родительскую модель с пустыми уровнями.
пожалуйста, добавьте сюда свой код с условием whereHas
использовать :
$pingtree = Pingtree::where('company_id', $company_id)
->where('id', $id)
->with([
'pingtree_entries' => fn($q) => $q->has('tiers'),
'pingtree_entries.tiers',
])
->first();
используйте whereHas() вместо has()