巢狀預載入 MorphTo 關聯的一個問題需注意

邢闖洋發表於2020-07-29

首先我們建立三張表

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 協議》,轉載必須註明作者和本文連結

相關文章