laravel / elequent - модели и отношения - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь выучить laravel и сделать несколько тестов / демонстрационных приложений. Я боролся сейчас с отношениями Laravel / Eloquent таблиц. И мне нужен совет.

У меня есть 3 модели [Application, Term, AppState] и их таблицы приложения [id, terms_id, appStates_id и другие столбцы], term [id, startDate, endDate, ...], app_states [id, заголовок]

Приложение. php

    public function term()
    {
        return $this->belongsTo('App\Term');
    }
    public function appState()
    {
        return $this->belongsTo('App\AppState');
    }

in Term. php и AppState. php у меня есть:

    public function applications()
    {
        return $this->hasMany('App\Application');
    }

Как я могу получить, скажем, "заголовок" / "startDay" + "endDate" в блейде для каждого приложения? Я могу получить их идентификаторы $app->terms_id / $app->appStates_id в foreach l oop, но я хочу получить caption значение из таблицы app_states.

Должно ли это отношение быть также указано в миграциях? В некоторых статьях упоминается, что это не нужно, если я хочу обработать это только в laravel.

Спасибо за совет

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

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

Например, предположим, что вы передали коллекцию приложений в ваше представление ($apps):

@foreach($apps as $app)
    {{ $app->term->startDate }}
    {{ $app->term->endDate }}

    {{ $app->appState->caption }}
@endforeach

Важное примечание. Мы получаем доступ к отношениям Eloquent с помощью ->appState, а не ->appState(). Последний фактически обращается к экземпляру Query Builder и имеет несколько более сложных вариантов использования

0 голосов
/ 14 апреля 2020

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

$application = Application::find(1);

$application->term->startDate;
$application->term->endDate;
$application->appState->caption;

Также ваши отношения с AppState неверны, поскольку ваш внешний ключ не соответствует snake_case набирая, вам нужно будет предоставить соответствующий ключ

public function appState()
{
    return $this->belongsTo('App\AppState', 'appStates_id');
}

Вы также можете проверить terms_id, так как имя модели (Term) является единственным, а внешний ключ - множественным .

Должно ли это отношение быть также указано в миграциях? В некоторых постах упоминается, что это не нужно, если я хочу обработать это только в laravel.

Ну, да, вам не нужно, если Laravel будет только один доступ к этой базе данных. Но если в ближайшем будущем вы решите перейти на другую платформу или использовать ту же базу данных в другом приложении, лучше включить эти отношения в миграцию. Также администратор базы данных, вероятно, съежится, если вы этого не сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...