Отношение Laravel - HasMany не загружается

У меня проблема с hasMany-отношением в моем приложении Laravel. Я уверен, что это простой вопрос, но в настоящее время я борюсь с ним и не могу найти причину.

У меня есть Модель по имени LandingPage:

<?php

namespace app\Models\LandingPage;

class LandingPage extends \App\Models\Base
{
    public $table = "landing_pages";

    protected $fillable = [
        'name',
        'event_id',
        'url_id',
        'is_update_needed',
        'view',
        'created_at',
        'updated_at',
    ];

    protected $hidden = [
    ];

    protected $appends = [
        'app_icon',
        'landing_page_url_base_path'
    ];

    ...

    public function app_info() {
        return $this->hasOne(\App\Models\App\AppInfo::class, "landing_page_id", "id");
    }

    public function app_images() {
        return $this->hasMany(\App\Models\App\AppImage::class, "landing_page_id", "id");
    }

    public function app_texts() {
        return $this->hasMany(\App\Models\App\AppText::class, "landing_page_id", "id");
    }

    ...
}

Проблема в app_texts(). Я не загружаю app_texts моей целевой страницы. Как видите, отношения app_info и app_images аналогичны. Я скопировал/вставил отношение из app_images в app_texts. app_images работает нормально. Вот модель AppText:

<?php
namespace app\Models\App;

class AppText extends \App\Models\Base
{
    public $table = "app_texts";

    protected $fillable = [
        'text',
        'type',
        'landing_page_id',
        'created_at',
        'updated_at'
    ];

    protected $hidden = [
    ];

    public function landing_page() {
        return $this->hasOne(\App\Models\LandingPage\LandingPage::class, "id", "landing_page_id");
    }
}

В базе все правильно настроено:

целевые_страницы:

приложения_тексты:

Я также вижу в отладочной панели Laravel, что запрос не выполняется для загрузки app_texts:

Я что-то забыл или у меня что-то не так?

Обновлять

Целевая страница является частью другой Модели (guests). Я называю там свойство landing_page, но без явного вызова отношений. Это работает для app_images или app_info, поэтому я не думаю, что мне нужно явно вызывать app_texts.

Это раздел контроллера, где он называется:

public function showEvent(\Illuminate\Http\Request $request, string $eventName, string $guestIdentifierToken) {
        $guest = $this->guestRepository->getByIdentifierToken($guestIdentifierToken);
        if ($guest != null) {
            if ($guest->landing_page->is_update_needed == 1) {
                //...
                //do some stuff
            }
            return view('event.landingpage', [
                'eventUrl' => url()->current(),
                'guest' => $guest,
                'event' => $guest->event,
                'landingPage' => $guest->landing_page 
            ]);
        }
        else {
            return redirect('/notFound');
        }
    }

Это работает, если я вызываю свойство явно:

$guest->landing_page->app_texts = $guest->landing_page->app_texts;

Но почему мне это нужно для app_texts, а не для app_images или app_info?

Вы звоните app_texts отношениям на своей странице?

Peppermintology 18.12.2020 10:35

где код, который якобы вызывает app_texts?

N69S 18.12.2020 10:36

Не явно, но и другие отношения я не называю. Так что не думаю, что это причина...

dns_nx 18.12.2020 10:36

Вы с нетерпением ждете загрузки других отношений и забываете сделать это с этим отношением?

Peppermintology 18.12.2020 10:39

Пожалуйста, посмотрите мое обновление...

dns_nx 18.12.2020 10:42

В вашем event.landingpage представлении должно быть что-то, вызывающее другие отношения, иначе они с нетерпением загружаются в вашу LandingPages модель, но не app_texts отношения.

Peppermintology 18.12.2020 10:50

Нет, там данные просто передаются в React с помощью window.guest = {!! json_encode($guest) !!}. До сих пор остается загадкой, почему, но я постараюсь решить и опубликовать решение здесь, если найду причину.

dns_nx 18.12.2020 11:00

«поэтому я не думаю, что мне нужно явно вызывать app_texts», я пропускаю часть вашего вопроса, поэтому данные app_texts отсутствуют, когда вы пытаетесь использовать их в своем javascript? Похоже, где-то вы вызываете загрузку app_info&app_images, хотя вы думаете, что этого не было

Flame 18.12.2020 12:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
8
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На вашей LandingPage модели два appends:

protected $appends = [
    'app_icon',
    'landing_page_url_base_path'
];

Когда ваша модель LandingPage преобразуется в json, эти два поля будут включены, что означает, что будут вызываться связанные с ними методы доступа. Я предполагаю, что вы используете свои отношения app_info и app_images внутри своих функций доступа getAppIconAttribute() и getLandingPageUrlBasePathAttribute().

Поскольку отношения используются в этих аксессорах, они будут включены в вывод json. Однако, поскольку отношение app_texts никогда не используется, оно не будет включено.

Если вы хотите, чтобы ваши отношения app_texts были включены в ваш вывод json, вам нужно будет загрузить его, прежде чем конвертировать в json. Самое быстрое решение для вас — просто загрузить его в свою функцию showEvent():

$guest->landing_page->load('app_texts');

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