引言
在資料庫表的設計時,對不同的功能進行切分,分割為不同的表進行儲存。在業務邏輯中,再將需要連線的資料進行整合輸出。
今天我們說一說,在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語句用於呼叫模型內宣告的關聯關係,其實它接收一個數組,可以在查詢時關聯多張表,同時支援一個閉包,用於對關聯表的查詢語句進行裁切。
如上一節要指定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 :-)
引言
在資料庫表的設計時,對不同的功能進行切分,分割為不同的表進行儲存。在業務邏輯中,再將需要連線的資料進行整合輸出。
今天我們說一說,在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 :-)