回覆列表
  • 1 # 程式設計師小助手

    引言

    在資料庫表的設計時,對不同的功能進行切分,分割為不同的表進行儲存。在業務邏輯中,再將需要連線的資料進行整合輸出。

    今天我們說一說,在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 :-)

  • 中秋節和大豐收的關聯?
  • 白鞋革的發黃了怎麼辦?