这适用于Laravel 5.2。我不确定这两段代码之间有什么区别,但是一个似乎是通过引用工作而另一个不是。
在此示例中,查询对象不保留方法调用中的任何修改,这迫使我检查false以执行操作:
$query = new User();
$query = $this->processOrderByFields($query, $request, User::getOrderByFields());
if ($query === false) {
return $this->respondError(HTTP_UNPROCESSABLE_ENTITY);
}
public function processOrderByFields($query, $request, $availableFields)
{
# Get fields
foreach ($fields as $field) {
# Do things to the field...
if ( # Not important ) {
$query = $query->orderBy(# Field, # Direction);
} else {
$badFields[] = $field;
}
}
if ($badFields) {
return false;
} else {
return $query;
}
}
然而,这很好用:
$query = new User();
$this->processInclude($query, $request, Client::getIncludeRelationships());
public function processInclude($query, $request, $objectRelationship )
{
if ( $request->get('include') && is_array($request->get('include')) ) {
$include = array_intersect($request->get('include'), $objectRelationship);
foreach($include as $relation) {
$query->with($relation);
}
}
}
我猜这与with
方法的关系构建部分有关,但我不确定。
答案 0 :(得分:0)
我认为在发布之前我已经检查了这个,但答案似乎在于方法如何与容器和父对象进行交互:
在Illuminate\Database\Eloquent\Model
:
public static function with($relations)
{
if (is_string($relations)) {
$relations = func_get_args();
}
$instance = new static;
return $instance->newQuery()->with($relations);
}
在Illuminate\Database\Query\Builder
:
public function orderBy($column, $direction = 'asc')
{
$property = $this->unions ? 'unionOrders' : 'orders';
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
$this->{$property}[] = compact('column', 'direction');
return $this;
}
因此,with
创建了一个新的查询静态实例(我不确定这意味着什么,但总体效果似乎是它在方法返回后仍然存在),而orderBy必须被链接。这证实了我的经验,但with
方法的细微差别让我感到厌烦。
修改强>
所以第二种方法实际上不起作用!我没有意识到它,直到我尝试调用一个只有一个关系包含查询参数而不是那个参数加上其他参数的端点。显然,with
类中的静态实例必须以与其他查询链相同的方式传递($query = $query->...
)。
我希望这对某人有所帮助,因为我已经坚持了几个小时。