Laravel - HasMany 关系未加载
Laravel - HasMany relation not loading
我的 Laravel 应用程序中的 hasMany
关系有问题。
我敢肯定,这是一个简单的问题,但目前我正在努力解决这个问题,找不到原因。
我有一个名为 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
。我有 copy/pasted 从 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");
}
}
数据库中的所有设置是否正确:
landing_pages:
app_texts:
我还可以在 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
?
您的 LandingPage
模型上有两个 appends
:
protected $appends = [
'app_icon',
'landing_page_url_base_path'
];
当您的 LandingPage
模型转换为 json 时,将包含这两个字段,这意味着将调用它们的关联访问器。我的猜测是您在 getAppIconAttribute()
和 getLandingPageUrlBasePathAttribute()
访问器函数中使用 app_info
和 app_images
关系。
由于这些访问器中使用了关系,因此它们将包含在 json 输出中。但是,由于从未使用过 app_texts
关系,因此不会包含它。
如果您希望 app_texts
关系包含在 json 输出中,您需要在转换为 json 之前加载它。最快的解决方案是将它加载到 showEvent()
函数中:
$guest->landing_page->load('app_texts');
我的 Laravel 应用程序中的 hasMany
关系有问题。
我敢肯定,这是一个简单的问题,但目前我正在努力解决这个问题,找不到原因。
我有一个名为 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
。我有 copy/pasted 从 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");
}
}
数据库中的所有设置是否正确:
landing_pages:
app_texts:
我还可以在 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
?
您的 LandingPage
模型上有两个 appends
:
protected $appends = [
'app_icon',
'landing_page_url_base_path'
];
当您的 LandingPage
模型转换为 json 时,将包含这两个字段,这意味着将调用它们的关联访问器。我的猜测是您在 getAppIconAttribute()
和 getLandingPageUrlBasePathAttribute()
访问器函数中使用 app_info
和 app_images
关系。
由于这些访问器中使用了关系,因此它们将包含在 json 输出中。但是,由于从未使用过 app_texts
关系,因此不会包含它。
如果您希望 app_texts
关系包含在 json 输出中,您需要在转换为 json 之前加载它。最快的解决方案是将它加载到 showEvent()
函数中:
$guest->landing_page->load('app_texts');