2014-05-12 17 views
16

Khi tôi đang sử dụng hùng hồn, tôi có thể sử dụng phương thức "where" rồi phương thức 'get' để điền vào một đối tượng chứa những gì tôi đã chọn trong cơ sở dữ liệu của mình. Ý tôi là:Làm thế nào để loại trừ các cột xác nhận trong khi sử dụng eloquent

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

Ở đây tôi có thể chọn các cột tôi muốn để có được như 'giả', 'email', vv .. Nhưng những gì tôi bỏ lỡ trong laravel doc là cách để làm điều ngược lại. Có thể là một cái gì đó như thế:

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

Cảm ơn bạn vì câu trả lời tương lai và có một ngày tốt đẹp.

+0

Câu hỏi đặt ra là tại sao bạn muốn làm điều đó? Sử dụng ORM bạn không muốn làm điều đó, và nếu bạn không muốn hiển thị một số cột, có nhiều cách khác để đạt được điều đó. –

+2

Tôi hỏi nó bởi vì khi bạn có 15 cột và bạn muốn 13, nó có thể nhanh hơn để làm một cái gì đó như -> notGet (['column14', 'column15']); thay vì -> get (['column1', 'column2', [...], 'column13']) ;. Bạn thấy không? – Brazeredge

+0

Bạn không hiểu, tôi hỏi tại sao? Trừ khi điều này không liên quan đến Eloquent. –

Trả lời

25

AFAIK không có tùy chọn xây dựng trong SQL để loại trừ các cột một cách rõ ràng, do đó Laravel không thể làm điều đó. Nhưng bạn có thể thử this trick

Cập nhật

Lừa khác là để xác định tất cả các cột trong mô hình của bạn

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)); 
} 

Sau đó, bạn có thể làm:

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

-> loại trừ? Điều này sẽ dẫn đến phương pháp không được phép. – Leon

+1

@Leon Hàm mô hình trên 'scopeExclude()' được gọi như thế. Đọc về phạm vi laravel trên https://laravel.com/docs/5.3/eloquent#local-scopes – cari

+0

Phương pháp này không hoạt động khi bị xích với [tải mối quan hệ háo hức] (https://laravel.com/docs/5.4/eloquent -relationships # eager-loading): bản thân mô hình trả về cột đúng mà không có các phần bị loại trừ, nhưng các mối quan hệ không được lấy ra. –

2

bạn có thể sử dụng hidden mảng như thế này:

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

Tôi không biết về phiên bản Laravel trước, nhưng trong 5.4 bạn có thể đặt dòng này trong mô hình tài

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

và sau đó

User::find(1); 

sẽ trả lại tất cả các lĩnh vực trừ pseudo, email , agecreated_at.

Nhưng bạn vẫn có thể lấy những lĩnh vực tiềm ẩn bằng cách sử dụng

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

cũng có sẵn trong Laravel 5.1 – Bugfixer

0

Chúng tôi nhận được sự hùng biện đối tượng từ mô hình đầy đủ với tất cả các lĩnh vực, biến nó để mảng và chúng tôi đặt nó bên trong một bộ sưu tập. Hơn tất cả các trường, ngoại trừ tất cả các trường được chỉ định trong trường mảng $.

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

rõ ràng hơn, chúng ta hãy đưa ra một ví dụ:

// 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; 

Ví dụ này trên làm chính xác những điều tương tự trong những người đầu tiên, nhưng nó hơn giải thích.

+2

Tốt hơn là nên thêm một số giải thích cho câu trả lời của bạn. – Ibo

+1

Hey @Ibo Đã thực hiện. Vui lòng xác minh lại. –

Các vấn đề liên quan