2014-09-26 26 views
4

如果我想用雄辯的,我可以做這樣的事情得到數據庫第一個用戶的名字聯繫在一起:Pluck公司與第一使用查詢生成器

$user = User::select('name')->first()->pluck('name'); 
// or $user = User::first()->pluck('name'); 

echo $user; 

獲得該用戶的字符串的唯一名字。

但是如果我嘗試同樣只使用查詢生成器:

$user = DB::table('users')->select('name')->first()->pluck('name'); 

echo $user; 

我得到異常:

調用未定義的方法stdClass的::動物內臟()

但是,如果沒有首先使用它將工作:

$user = DB::table('users')->select('name')->where('id',1)->pluck('name'); 

echo $user; 

是不是可以使用pluckfirst使用查詢生成器還是我做錯了什麼?

PS。當然,我知道,我可以不使用pluck顯示使用$user->name任何財產,但我只是好奇,爲什麼用雄辯它的工作原理和使用查詢生成器它只能不同時具有firstpluck

回答

12

你不想當使用pluckfirst,因爲它是多餘的:

$query->first() // fetch first row 
     ->pluck('name'); // fetch first row again and return only name 

所以只使用pluck

$query->pluck('name'); 

它做你需要的一切。


但還有更多。

引擎蓋下firstpluck運行兩個單獨的查詢,所以:

$query->where(..)->orderBy(..)->first() // apply where and orderBy 
     ->pluck('name'); // no where and orderBy applied here! 

所以它不僅多餘pluck前使用first,而且它會導致意想不到的結果。


您可以鏈子雄辯查詢這些方法,因爲它返回一個集合(get)或模型(first),但Query\Builder回報只是一個陣列(get)或stdObjectfirst)。這就是爲什麼你不能在查詢生成器上做同樣的事情。

+1

謝謝,再有沒有足夠的文檔。我認爲它只是在這種情況下得到所有列並只返回一個或修改查詢(當你不使用select時),並再次只返回這個選定的列 – 2014-09-26 07:44:50

+0

Upvoting因爲這個答案比我的好。 – lowerends 2014-09-26 07:47:25

+0

@MarcinNabiałek感謝'__call'神奇的方法,無處不在調用Eloquent模型中的'pluck'來代表對'Eloquent \ Builder'的調用,這就是爲什麼你可以對'first'的結果做到這一點。你甚至可能不會注意到它只是運行了另一個查詢 - 在這裏就是這種情況。 – 2014-09-26 07:52:07

1

試試這個:

$user = User::pluck('name')->first(); 
echo $user; 
0

在Laravel 5.1+,你可以使用value方法。

從文檔:

如果你甚至都不需要一整行,您可以提取使用值方法記錄單個值 。該方法將返回 值直接列:

$email = DB::table('users')->where('name', 'John')->value('email'); 

這是它是如何工作的生成器類幕後:

/** 
* 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; 
} 
+0

而你確認它在Laravel 4中正常工作,對吧? – 2017-11-06 14:18:53

+0

沒有看到laravel-4標籤,謝謝!我會更新我的答案。它可能對其他人有用。 – Joren 2017-11-06 19:57:06