引言
在數據庫表的設計時,對不同的功能進行切分,分割為不同的表進行存儲。在業務邏輯中,再將需要連接的數據進行整合輸出。
今天我們說一說,在Laravel中,如何關聯模型,以及制定返回列,以精簡返回數據。
學習時間假如有兩個模型 User 和 Post,一個用戶會發布多個post,也就是一對多的關聯關系。在User模型中,指定此關系:
public function post(){ return $this->hasmany('Post'); }
反過來,在Post模型中,必然有一個發布者,是一對一的映射:
public function user(){ return $this->belongsTo('User'); }
現在假如有一個查詢,獲取所有的帖子,并返回發布者的信息。如下:
public function getAllPosts() { return Post::with('user')->get(); }
這樣在返回值中,就可以使用 $post->user 返回 User 模型,并訪問其屬性和方法。經過框架整合后的 SQL 語句大概是這樣的:
select * from `posts` select * from `users` where `users`.`id` in (<1>, <2>)
顯然,第二條SQL語句,返回了user表的所有列,數據量有可能很大。是否可以返回指定列呢?這樣可以精簡輸出,減少MySQL的傳輸負荷。
with語句模型的with語句用于調用模型內聲明的關聯關系,其實它接收一個數組,可以在查詢時關聯多張表,同時支持一個閉包,用于對關聯表的查詢語句進行裁切。
如上一節要指定user表的列,可以這樣寫:
Post::with(array('user'=>function($query){ $query->select('id','username'); }))->get();
閉包內$query拼接SQL語句,并指定 select 選取的列,那么框架生成的SQL語句,就只會返回 id,username 列。
關聯關系我們注意到,在關聯關系的聲明上,第一節僅使用了 belongTo,hasMany 這樣的屬性,其實還可以鏈式調用。這樣對于所有使用 with 語句關聯的模型查詢,都會生效。
沒錯兒,接著關聯關系用下去。比如Post模型內:
public function user() { return $this->belongsTo('User')->select(array('id', 'username')); }
特殊性在Laravel5.5及以上的版本,支持在使用with語句的使用,按照格式書寫返回指定列。
Post::with('user:id,username')->get();
低版本可就沒有那么好運氣了!:-(
寫在最后本文通過2種確切可用的方式,裁剪了關聯模型返回列的內容。
在實際代碼中,第一種使用閉包修剪SQL語句,用途較為廣泛。
第二種方式影響全局,一般不推薦。
第三種則是第一種的變體,但是對版本有要求。
Happy coding :-)
我是 @程序員小助手 ,持續分享編程知識,歡迎關注。