在使用 Laravel 的關聯查詢中,with不為人知的用法


第一種方法:在模型里就寫好,固定死

方便簡潔,但是不能針對不同的需求去關聯不同的字段,一旦在模型關聯中寫死,所有的關聯的字段都是一樣的

在user模型里,寫關聯函數,一對多。此模型放在APP\Models下,默認放在App下

1 public function hasPost(){
2     return $this->hasMany('App\Models\post','外鍵','主鍵')->select('id','content','title');
3 }

第二種方法:可以在寫查詢的過程中指定需要關聯的字段

這種方法比較自由,是在各自的邏輯控制器里實現,比較自由

1 public function test(User $user)
2 {
3     $return_datas  = $user->with(['hasPost'=>function($query){
4                                         $query-select('主鍵','外鍵','content','title');
5                                      }) ->get();
6 }

 

第三種方法:利用 Laravel 的查詢范圍將其封裝起來:定義一個基礎模型baseModel,然后所有的模型都繼承自基礎模型baseModel,或者使用trait

在基礎模型里

復制代碼
1 class BaseModel extends \Eloquent{
2     public function scopeWithOnly($query, $relation, Array $columns)
3     {
4         return $query->with([$relation => function ($query) use ($columns){
5             $query->select(array_merge(['id'], $columns));
6         }]);
7     }
8 }
復制代碼

在我們普通的 Model 類都繼承基類:

1 class User extends BaseModel{
2     public function hasPost()
3     {
4          return $this->hasMany('App\Models\post')
5     }
6 }

再接着邏輯實現自己想要的

1 1 public function test(User $user)
2 2 {
3 3     $return_datas  = $user->with(['hasPost',['字段1','字段2',.....]) ->get();
4 6 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM