原文:https://www.jianshu.com/p/dad1a9d71c94
Laravel的Eloquent ORM提供了漂亮、簡潔的 ActiveRecord 實現來和數據庫交互。每個數據庫表都有一個對應的「模型」用來與該表交互。你可以通過模型查詢數據表中的數據,並將新記錄添加到數據表中。這個也是本人比較喜歡Laravel的一大原因,同時Eloquent ORM對於數據表關聯提供了較為簡單關聯管理和使用。
在實際開發中,我們常常會遇到一對多的關聯關系,就比如商城來說,一個商品分類會擁有很多個商品,他們的關系如下:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Category extends Model { /** * 分類下面的商品 * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function goods() { return $this->hasMany(Good::class); } }
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Good extends Model { /** * 商品所屬分類 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function category() { return $this->belongsTo(Category::class); } }
查詢某個分類之下的商品可用下面的方法:
public function goods($categoryId) { $category = Category::find($categoryId); $goods = $category->goods; return $goods; }
是不是很簡單且優雅呢!好了,回到正題,如果有這樣子的一個需求:需要從同一個接口返回分類和屬於該分類的商品。面對這樣的一個需求,我寫出如下的代碼:
public function category($categoryId) { $category = Category::with('goods')->find($categoryId); return $category; }
這里的with方法會將分類之下的商品一起查詢出來,而且不會出現N+1影響性能的問題,看來with方法真的不耐啊。在實際項目中,我們往往不是把全部商品查詢出來,比如我們要把分類下面上架的商品查詢出來,這又該怎么辦呢?這里就引申出with方法的第二種用法了:
public function category($categoryId) { $category = Category::with(['goods' => function ($query) { $query->where('is_sale', true); }])->find($categoryId); return $category; }
這里的with方法可以理解為給分類下面的商品一個條件,符合該$query->where('is_sale', true);
就查詢出來,是不是覺得這個with方法特別好用呢!
作者:Dazoa
鏈接:https://www.jianshu.com/p/dad1a9d71c94
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。