Mar*_*łek 8 laravel eloquent laravel-4
如果我想使用eloquent获取数据库中第一个用户的名称,我可以这样做:
$user = User::select('name')->first()->pluck('name');
// or $user = User::first()->pluck('name');
echo $user;
Run Code Online (Sandbox Code Playgroud)
仅将此用户的名称作为字符串.
但是,如果我仅使用查询生成器尝试相同的操作:
$user = DB::table('users')->select('name')->first()->pluck('name');
echo $user;
Run Code Online (Sandbox Code Playgroud)
我得到例外:
调用未定义的方法stdClass :: pluck()
但是没有先使用它会起作用:
$user = DB::table('users')->select('name')->where('id',1)->pluck('name');
echo $user;
Run Code Online (Sandbox Code Playgroud)
这难道不是可以使用pluck与first使用查询生成器或我做错了什么?
PS.当然我知道我可以使用$user->name而不使用显示任何属性,pluck但我只是好奇为什么使用Eloquent它工作并使用查询生成器它只有当没有和两个first和pluck
Jar*_*zyk 18
你不希望使用pluck有first,因为它是多余的:
$query->first() // fetch first row
->pluck('name'); // fetch first row again and return only name
Run Code Online (Sandbox Code Playgroud)
所以只使用pluck:
$query->pluck('name');
Run Code Online (Sandbox Code Playgroud)
它可以满足您的一切需求.
但还有更多.
下罩first和pluck运行2个独立的查询,因此:
$query->where(..)->orderBy(..)->first() // apply where and orderBy
->pluck('name'); // no where and orderBy applied here!
Run Code Online (Sandbox Code Playgroud)
所以它不仅first在以前使用多余pluck,而且还会导致意想不到的结果.
您可以在Eloquent查询上链接这些方法,因为它返回一个collection(get)或model(first),但Query\Builder只返回一个数组(get)或stdObject(first).这就是为什么你不能在查询构建器上做同样的事情.
在Laravel 5.1+中,可以使用该value方法。
从文档:
如果您甚至不需要整行,都可以使用value方法从记录中提取单个值。此方法将直接返回列的值:
Run Code Online (Sandbox Code Playgroud)$email = DB::table('users')->where('name', 'John')->value('email');
这是在Builder类的幕后工作方式:
/**
* Get a single column's value from the first result of a query.
*
* @param string $column
* @return mixed
*/
public function value($column)
{
$result = (array) $this->first([$column]);
return count($result) > 0 ? reset($result) : null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15150 次 |
| 最近记录: |