我在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');
}
我尝试将这部分代码复制到repository,但是我不能链接方法,因为当$region
被获取时,它不再被认为是repository示例,而是Eloquent
。现在它需要的是Eloquent
方法。
3条答案
按热度按时间vybvopom1#
我认为你的抽象水平有点混合,因为你没有抽象模型本身,但无论如何。解决方案可能是这样的:
然后:
mutmk8jj2#
我没有做到我想要的,但令人满意的解决方案是将完整的逻辑放在方法中,所以现在我有了这个:
roejwanj3#