嵌套预加载 MorphTo 关联的一个问题需注意

准备工作

首先我们创建三张表

posts
id - integer
name - string

users
id - integer
nickname - string

images
id - integer
url - string
imageable_id - integer
imageable_type - string

接着我们在 images 模型中增加 morphTo 的关联

public function imageable()
{
    return $this->morphTo();
}

问题场景

Images::with(['imageable:id,name'])->get();

在上面使用过程中发现一个问题就是我们在设计表的时候,postsusers 中的字段都是不同的,那么这时候会有一个需求是在 with 中判断表的来源是 posts 还是 users 来进行查询不同的表字段已达到预期的效果

类似于 whereHasMorph

Images::whereHasMorph(
    'imageable',
    [Users::class, Posts::class],
    function (Builder $query, $type) {
        if ($type === Users::class) {
            $query->selectRaw("id,nickname");
        } elseif ($type === Posts::class) {
            $query->selectRaw("id,name");
        }
    }
);

结语

目前没有找到有效的办法能够实现这一目的,仅此一个能够实现的办法如下

$imageUsers = images::with([
    'imageable' => function ($query) {
        $query->selectRaw("id,nickname");
    }
])->where('imageable_type', 'App\Users')->get();

$imagePosts = images::with([
    'imageable' => function ($query) {
        $query->selectRaw("id,name");
    }
])->where('imageable_type', 'App\Posts')->get();

就是通过两次分别查询,但这种方案在复杂的查询语句中则是增加了很多代码。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!