我不明白为什么结果如此不同:
Shop::find($id)->with('products'); // just empty
Shop::find($id)->with('products')->first(); // ignores find()
但where()
同样如此。
Shop::where('id', $id)->with('products')->first(); // works fine
那么,这是最后一个正确的方法吗? (如果我只想要一家附有产品的商店)
答案 0 :(得分:4)
where()
返回一个查询构建器对象(您可以在执行get
或first
之前添加额外的术语)
来自源代码:
/**
* Add a basic where clause to the query.
*
* @param string $column
* @param string $operator
* @param mixed $value
* @param string $boolean
* @return $this
*/
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
if ($column instanceof Closure) {
$query = $this->model->newQueryWithoutScopes();
call_user_func($column, $query);
$this->query->addNestedWhereQuery($query->getQuery(), $boolean);
} else {
call_user_func_array([$this->query, 'where'], func_get_args());
}
return $this;
}
另一方面,find
只返回实际模型或模型集合(不是查询构建器)。
来自源代码:
/**
* Find a model by its primary key.
*
* @param mixed $id
* @param array $columns
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|null
*/
public function find($id, $columns = ['*'])
{
if (is_array($id)) {
return $this->findMany($id, $columns);
}
$this->query->where($this->model->getQualifiedKeyName(), '=', $id);
return $this->first($columns);
}
答案 1 :(得分:1)
查看api文档: http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html
只有返回$ this(Builder)的雄辩方法才能在管道中用于添加要选择的规则。