是否可以在Laravel中使用querybuilder进行预先加载?

时间:2017-03-06 11:29:41

标签: php laravel laravel-5.2

Querybuilder object

正如上面所示,有一个'eagerLoad'部分,querybuilder接受调用$query->with('relation')但产生以下错误:Method addEagerConstraints does not exist.

我试图在这个问题上找到一些文件,但没有找到太多。在这种情况下,是否可以使用急切加载?如果是这样,有人能说出来吗?

更新

有些人指出这是可能的,错误是由我的代码中的另一个错误引起的。以下是一些示例:

// Querybuilder
$query->select([
    'persons.id as alumni_id',
    ...
]);

$query->where('...'); // Based on search parameters
$query->groupBy('alumni_id');

$query->with('relation');

$result = collect($query->get());

// Model
public function relation()
{
    // Note: relation does have a column person_id
    return $this->hasMany(Relation::class, 'person_id', 'alumni_id')->get();
}

制作

BadMethodCallException in Macroable.php line 81: Method addEagerConstraints does not exist.

2 个答案:

答案 0 :(得分:1)

据我所知,不可能使用预先加载来加载与查询构建器的模型关系。 (因为查询构建者没有利用Eloquent,它不知道关系) 如果有人知道(部分)不正确,请告诉我。

答案 1 :(得分:0)

这应该有效

// Querybuilder
$query->select([
    'persons.id as alumni_id',
    ...
]);

$query->where('...'); // Based on search parameters
$query->groupBy('alumni_id');

$query->with('relation');

$result = $query->get(); // already returns a collection

// Model
public function relation()
{
    // Note: relation does have a column person_id
    // A relation should return an Eloquent object (HasMany in this case), not a collection
    return $this->hasMany(Relation::class, 'person_id', 'alumni_id');
}