У меня проблема с 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?
Не явно, но и другие отношения я не называю. Так что не думаю, что это причина...
Вы с нетерпением ждете загрузки других отношений и забываете сделать это с этим отношением?
Пожалуйста, посмотрите мое обновление...
В вашем event.landingpage
представлении должно быть что-то, вызывающее другие отношения, иначе они с нетерпением загружаются в вашу LandingPages
модель, но не app_texts
отношения.
Нет, там данные просто передаются в React с помощью window.guest = {!! json_encode($guest) !!}
. До сих пор остается загадкой, почему, но я постараюсь решить и опубликовать решение здесь, если найду причину.
«поэтому я не думаю, что мне нужно явно вызывать app_texts», я пропускаю часть вашего вопроса, поэтому данные app_texts
отсутствуют, когда вы пытаетесь использовать их в своем javascript? Похоже, где-то вы вызываете загрузку app_info
&app_images
, хотя вы думаете, что этого не было
На вашей 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');
Вы звоните
app_texts
отношениям на своей странице?