laravel中關聯模型查詢選擇性的字段
阿新 • • 發佈:2018-07-02
基類 per asp function 自己 ext 實現 arr scope 在使用 Laravel 的關聯查詢中,我們經常使用
在使用 Laravel 的關聯查詢中,我們經常使用 with
方法來避免 1+N
查詢,但是 with
會將目標關聯的所有字段全部查詢出來,對於有強迫癥的PHPer來說,當然是不允許發生的。
第一種方法:在模型裏就寫好,固定死
方便簡潔,但是不能針對不同的需求去關聯不同的字段,一旦在模型關聯中寫死,所有的關聯的字段都是一樣的
在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(‘主鍵‘,‘外鍵‘,‘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 }
laravel中關聯模型查詢選擇性的字段