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_infoapp_images。我有 copy/pasted 从 app_imagesapp_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_imagesapp_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_imagesapp_info

您的 LandingPage 模型上有两个 appends

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

当您的 LandingPage 模型转换为 json 时,将包含这两个字段,这意味着将调用它们的关联访问器。我的猜测是您在 getAppIconAttribute()getLandingPageUrlBasePathAttribute() 访问器函数中使用 app_infoapp_images 关系。

由于这些访问器中使用了关系,因此它们将包含在 json 输出中。但是,由于从未使用过 app_texts 关系,因此不会包含它。

如果您希望 app_texts 关系包含在 json 输出中,您需要在转换为 json 之前加载它。最快的解决方案是将它加载到 showEvent() 函数中:

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