2 回答
TA贡献1805条经验 获得超9个赞
我找到了一个解决方案来进行不可能的查询,该查询将返回 0 结果。
public function apply(Builder $builder, Model $model)
{
$input = $this->getAuthValues(get_class($model));
if (count($input) < 1) {
$builder->whereRaw('1 = 0');
return;
}
$jsonQuery = new JsonQuery($builder, $input);
$jsonQuery->search();
}
TA贡献1828条经验 获得超4个赞
由于作用域通常是链接的(称为流畅),并且作用域不直接负责执行查询,因此我认为您不能“优雅地退出”,因为下一个调用仍然需要一个对象来处理Builder。
一种可能的解决方案(并不简单)是创建一个扩展该类的类Builder,并重写负责实际从数据库获取结果的所有方法。我不确定您需要重写的所有方法才能在所有情况下都没有错误地工作。您可能还想处理其中的一些插入和更新情况AbortedBuilder。
class AbortedBuilder extends Builder
{
...
/**
* Run the query as a "select" statement against the connection.
*
* @return array
*/
protected function runSelect()
{
return [];
}
...
/**
* Run a pagination count query.
*
* @param array $columns
* @return array
*/
protected function runPaginationCountQuery($columns = ['*'])
{
return [];
}
...
/**
* Insert a new record and get the value of the primary key.
*
* @param array $values
* @param string|null $sequence
* @return int
*/
public function insertGetId(array $values, $sequence = null)
{
throw new \Exception('You are trying to insert using an aborted query!');
}
...
}
然后在你的范围内你可以这样做:
public function apply(Builder $builder, Model $model)
{
$input = $this->getAuthValues(get_class($model));
if (count($input) < 1) {
$builder = new AbortedBuilder();
} else {
$jsonQuery = new JsonQuery($builder, $input);
$jsonQuery->search();
}
- 2 回答
- 0 关注
- 113 浏览
添加回答
举报