首页 > 解决方案 > 如何在 with() 方法中使用关系?

问题描述

这是purchase_order模型:

class purchase_order extends Model
{
    protected $table = "purchase_order";

    public function commodities()
    {
        return $this->hasMany(commodities::class, 'purchase_order_id', 'id');
    }
}

这是commodities模型:

class commodities extends Model
{
    protected $table = "commodities";

    public function scopeInvoiced($query){
        return $query->where('invoiced', 1);
    }

}

鞠躬我需要得到所有的 purchase_order 以及他们的发票商品。我怎样才能做到这一点?


它们都不起作用:

purchase_order::with(commodities::invoiced())->get();

purchase_order::commodities()->invoiced()->get();

标签: phplaravel

解决方案


检查文档的约束急切负载部分:

约束急切负载

有时您可能希望预先加载关系,但也为预先加载查询指定额外的查询约束。这是一个例子:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();

在这个例子中,Eloquent 只会预先加载帖子标题列包含单词 first 的帖子。当然,您可以调用其他查询构建器方法来进一步自定义预加载操作:

$users = App\User::with(['posts' => function ($query) {
    $query->orderBy('created_at', 'desc');
}])->get();

因此,在此之后,请尝试以下代码:

$purchase_orders = purchase_order::with(['commodities' => function ($query) {
    $query->where('invoiced', 1);
}])->get();

推荐阅读