Laravel存储库模式添加查询

时间:2017-12-19 07:09:50

标签: php laravel repository-pattern

我在Laravel中创建了一个存储库模式,我创建了一个AbstractRepository类,它由任何存储库扩展,以获得可以共享的最常用的CRUD方法。

现在,如果我需要一些更复杂的查询,我可以通过向具体存储库添加其他方法来扩展主要功能。

例如:

public function eagerWhere($column, $value, $relation, $orderBy = 'name')
{
    return Region::with($relation)->where($column, $value)->orderBy($orderBy);
}

现在我遇到问题的部分是使用我的存储库的主代码中的这一部分:

$regions = $this->regionRepository->eagerWhere('name', $term, 'country');


if ($includeCountry) { //<-- from here
    $regions->orWhereHas('country', function ($query) use ($term) {
        $query->where('name', 'LIKE', '%' . $term . '%');
    });
}

如何在存储库中编写该部分,以便最终使其看起来像:

$regions = $this->regionRepository->eagerWhere('name', $term, 'country');


if ($includeCountry) {
    $regions->orWhereHas($term, 'country');
}

我尝试将这部分代码复制到存储库,但后来我无法链接方法,因为在获取$region时,它不再被视为存储库实例,而是Eloquent一个。而现在它正在期待Eloquent方法。

2 个答案:

答案 0 :(得分:0)

我认为你的抽象程度有点混乱,因为你也不是抽象模型本身,但无论如何。解决方案可能是这样的:

public function eagerWhere($column, $value, $relation)
{
    $builder = Region::with($relation)->where($column, $value);

    return $builder
}

然后:

$regions = $this->regionRepository->eagerWhere('name', $term, 'country');


if ($includeCountry) {

    $regions->orWhereHas($term, 'country');
}

return $regions->orderBy('name')->get(); 

答案 1 :(得分:0)

我没有设法完全我想要的东西,但是令人满意的解决方案是将完整的逻辑放在方法中,所以现在我有了:

public function eagerWhereLike($column, $value, $relation, $searchOnRelation = false, $orderBy = 'name')
{
    $regions = Region::with($relation)->where($column, 'LIKE', '%' . $value . '%')->orderBy($orderBy);

    if ($searchOnRelation) {
        $regions->orWhereHas($relation, function ($query) use ($column, $value) {
            $query->where($column, 'LIKE', '%' . $value . '%');
        });
    }

    return $regions;
}