Larvel, запрашивающий существование отношения, по-прежнему возвращает пустые записи

Я работаю над проектом 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() вместо has()

sandip bharadva 30.01.2023 12:02
->whereHas('pingtree_entries.tier'), добавленный в модель Pingtree, по-прежнему возвращает родительскую модель с пустыми уровнями.
Ryan H 30.01.2023 12:06

пожалуйста, добавьте сюда свой код с условием whereHas

sandip bharadva 30.01.2023 12:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

использовать :

$pingtree = Pingtree::where('company_id', $company_id)
        ->where('id', $id)
        ->with([
            'pingtree_entries' => fn($q) => $q->has('tiers'),
            'pingtree_entries.tiers',
        ])
        ->first();

Другие вопросы по теме