【问题标题】:Laravel eloquent call optional relationship in queryLaravel eloquent 在查询中调用可选关系
【发布时间】:2021-04-19 14:54:18
【问题描述】:

我正在尝试使用 Laravel eloquent 进行查询。我有一个表posts,它有一个变形关系列author。这个author 列可以引用users 表或admins 表。所以这就是我获取每个postsauthor 的方式:

    $query = Post::with(['author']);

现在,如果authoruser,我想包括另一个表,即address。问题是,admin 表中没有 address 关系。
所以,当我尝试这样做时,

    $query = Post::with([
        'author' => function ($q) {
            $q->with('address');
        }
    ]);

它抛出了 Illuminate\Database\Eloquent\RelationNotFoundException 异常,因为关系 address 没有为 admin 定义。
我该如何解决这个问题?我想用author 获取所有posts,并将address 包含在具有address 的作者中

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您可以通过将whereHaswhereDoesntHave 结合使用来解决这个问题,以同时包含有地址和没有地址的Author

    $query = Post::with([
        'author' => function ($q) {
            $q->whereHas('address');
            $q->orWhereDoesntHave('address');
        }
    ]);
    

    如果您只有whereHas 而没有orWhereDoesntHave,它将只返回具有author 和现有address 的帖子,而不是author 没有address 的帖子,因此急切地加载谁拥有和谁你不是同时包含wherHasorWhereDoesntHave

    【讨论】:

    • 我抛出错误Method Illuminate\Database\Query\Builder::address does not exist. 我认为是因为当它试图获取adminaddress 时,它不能。 orWhereDoesntHave() 仍然需要一个有效的关系。
    • 您是否已经在Author 模型中定义了关系?
    • 是的,已经定义了关系,当我只选择users 作为作者的行时,我可以查询关系address。没有为admins 定义address,因为没有
    • 尝试地址address或执行从数据库获取数据的查询时抛出错误?
    • 调用$query->get()时报错
    猜你喜欢
    • 2013-10-03
    • 2017-07-19
    • 2021-09-25
    • 2015-01-21
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多