2014-05-12 84 views
16

當我使用雄辯時,我可以使用「where」方法然後使用「get」方法填充包含我在數據庫中選擇的對象。 我的意思是:如何在使用雄辯時排除某些列

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray(); 

在這裏,我可以選擇我想要得到像「僞」,「電子郵件」,等等。 但我在laravel DOC錯過了什麼列是做相反的方式。 這可能是類似的東西:

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray(); 

謝謝您即將成爲答案,並有一個愉快的一天。

+0

問題是,爲什麼你想這樣做?使用ORM你寧願不這樣做,如果你只是不想顯示一些列,還有其他方法可以實現。 –

+2

我這樣問,因爲當你有15列,你想要13時,可以更快地做一些事情 - > notGet(['column14','column15']);而不是 - > get(['column1','column2',[...],'column13']);. 你看? – Brazeredge

+0

你不明白,我問爲什麼?除非這不是雄辯相關的。 –

回答

25

AFAIK SQL中沒有構建選項來明確排除列,所以Laravel無法做到這一點。但你可以嘗試this trick

更新

另一個竅門是指定模型

protected $columns = array('id','pseudo','email'); // add all columns from you table 

public function scopeExclude($query,$value = array()) 
{ 
    return $query->select(array_diff($this->columns,(array) $value)); 
} 

然後所有列,你可以這樣做:

$users = User::where('gender', 'M')->where('is_active', 1)->exclude(['pseudo', 'email', 'age', 'created_at'])->toArray(); 
+0

- >排除?這將導致方法不允許。 – Leon

+1

@Leon上面的模型函數'scopeExclude()'就是這樣調用的。在https://laravel.com/docs/5.3/eloquent#local-scopes上閱讀關於laravel範圍的內容 – cari

+0

與[渴望的關係加載]鏈接時,此方法不起作用(https://laravel.com/docs/5.4/eloquent -relationships#eager-loading):模型本身返回正確的列而沒有排除,但是關係無法被檢索。 –

2

可以使用hidden陣列像這樣:

class Promotion extends Model 
{ 
    protected $table = 'promotion'; 
    protected $hidden = array('id'); 
} 
14

我不知道以前的版本Laravel,但在5.4你可以把這個線在用戶模式

protected $hidden = ['pseudo', 'email', 'age', 'created_at']; 

然後

User::find(1); 

將返回所有領域,除了pseudoemailagecreated_at

但你仍然可以通過使用

$user = User::find(1); 
$email = $user['email']; 
+1

也可在Laravel 5.1 – Bugfixer

0

我們從模型中充滿各個領域的對象雄辯檢索那些隱藏字段,將其轉換爲數組,我們把它的集合內。除了我們獲得除數組$ fields中指定的所有字段外的所有字段。

$fields = ['a', 'b', 'c', 'N']; 
$object = Model::find($id); 
return collect($object->toArray())->except($fields); 

更清楚,讓我們舉一個例子:

// Array of fields you want to remove 
$fields_to_remove = ['age', 'birthday', 'address']; 

// Get the result of database 
$user = User::find($id); 

// Transform user object to array 
$user = $user->toArray(); 

// Create a collection with the user inside 
$collection = collect($user); 

// Get all fields of our collection except these fields we don't want 
$result = $collection->except($fields_to_remove); 

// Return 
return $result; 

這上面的例子正好使第一個同樣的事情,但它更多的解釋。

+2

最好給你的答案增加一些解釋。 – Ibo

+1

嘿@Ibo已經做到了。請再次驗證。 –