最近整一個後臺管理系統,遇到這麼個問題:需要在一個model的grid()和detail()方法中展示另一個model中的某個字段,但是隻存了主鍵id,沒存這個字段本身。
之前也遇到過這種問題,也解決了,但總覺得不夠優雅。之前代碼如下這種:
$grid->column('來源')->display(function() {
$user_info = User::where(['id' => $this->user_id])->first();
if ($user_info) {
$user_info = $user_info->toArray();
}
return isset($user_info['source']) ? $user_info['source'] : "";
});
思路很明確,但很繁瑣。事實上可以在需要展示的model中定義一個user()方法,關聯兩個model:
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
然後在對應的grid()方法中這麼寫就可以了:
$grid->column('user.source', __('來源'));
注意,這裏的user一定要和model中定義的user()方法名對應。同樣,如果是在detail()方法中展示,可以這樣:
$show->user('來源')->as(function ($user) {
return $user->source;
});
相比之前的版本,現在這個看起來就簡潔很多了。