«with» в Eloquent ничего не возвращает для одних отношений, но возвращает для других

У меня есть модель Member в моем приложении Laravel и в модели:

public function active_memberships() {
    return $this->hasMany(MemberMembership::class, 'member_id', 'id')->where(function($query) {
        $query->where('ends_at', '>', Carbon::now());
    });
}

public function promo_code() {
    return $this->hasMany(MemberPromoCode::class, 'member_id', 'id');
}

Обе таблицы member_memberships и member_promo_codes имеют member_id в качестве внешнего ключа. Однако, если я сделаю это:

$member = Member::with(['active_memberships','promo_code'])->find($id);

Я получаю массив active_memberships в $member, но не promo_code.

Итак, $member['active_memberships'] выводит массив, а $member['promo_code'] выдает ошибку:

Undefined index: promo_code

Что мне здесь не хватает?

У вас случайно нет столбца с названием promo_code в members таблице?

Abhay Maurya 25.02.2019 11:46

Я не. Если это поможет, у member_promo_codes есть другой внешний ключ, promo_code_id, который соединяет его с таблицей с именем promo_codes. Но я не понимаю, как это может повлиять на это.

sveti petar 25.02.2019 12:03
который соединяет его с таблицей под названием promo_codes Используйте with(['active_memberships','promo_codes']) затем (обратите внимание на с)
Clément Baconnier 25.02.2019 12:18

Нет, это не должно быть проблемой. Просто для отладки попробуйте следующее: $member = Member::with('promo_code')->find($id); и посмотрите, получите ли вы $member['promo_code'] ?

Abhay Maurya 25.02.2019 12:18

@cbaconnier, что ты сказал? Вы говорите, что использование 's' решит проблему? :)

Abhay Maurya 25.02.2019 12:20

@Learner В этом запросе я вижу массив promo_code! Как вы думаете, какое объяснение может быть? Является ли мой синтаксис неправильным для наличия нескольких withs?

sveti petar 25.02.2019 12:28

@jovan, нет, с тобой все в порядке, попробуйте решение, которое я предоставил ниже в качестве ответа, посмотрите, работает ли оно

Abhay Maurya 25.02.2019 12:31

@Learner Неважно, я думаю, что мой пустой желудок заставляет меня расплавить мозг :(

Clément Baconnier 25.02.2019 12:31

@cbaconnier классный

Abhay Maurya 25.02.2019 12:33

@jovan, я так понимаю, мое решение сработало?

Abhay Maurya 25.02.2019 13:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
10
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Попробуйте изменить методы отношений на следующие:

public function active_memberships() {
    return $this->hasMany('\App\MemberMembership', 'member_id')->where(function($query) {
        $query->where('ends_at', '>', Carbon::now());
    });
}

public function promo_code() {
    return $this->hasMany('\App\MemberPromoCode', 'member_id');
}

Вам не нужно передавать третий параметр как id, потому что это по умолчанию, и попытайтесь указать отношение, используя пространство имен, поскольку это самый простой способ определить отношения.

Посмотрите, работает ли тогда запрос контроллера?

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