首先我們建立三張表
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();
在上面使用過程中發現一個問題就是我們在設計表的時候,posts
和 users
中的欄位都是不同的,那麼這時候會有一個需求是在 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 協議》,轉載必須註明作者和本文連結