Laravel的Eloquent ORM 關聯關系中的with用法


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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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