【问题标题】:Passing query objects in Laravel by reference通过引用在 Laravel 中传递查询对象
【发布时间】:2016-07-05 20:50:05
【问题描述】:

这适用于 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 方法的关系建立部分有关,但我不确定。

【问题讨论】:

    标签: php eloquent laravel-5.2 query-builder


    【解决方案1】:

    我以为我在发布之前已经检查过了,但答案似乎在于方法如何与容器和父对象交互:

    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->...)。

    我希望这对某人有所帮助,因为我已经坚持了几个小时。

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 2013-08-11
      • 2011-07-06
      • 2012-07-07
      • 2012-01-05
      相关资源
      最近更新 更多