2015-11-04 17 views
9

Có cách nào để lấy ra một mô hình trong Laravel với tất cả các thuộc tính, ngay cả khi chúng là null? Nó dường như chỉ trả về một mô hình với các thuộc tính không phải là null.Lấy các mô hình Laravel với tất cả các thuộc tính

Lý do cho điều này là tôi có một hàm sẽ cập nhật các thuộc tính mô hình từ một mảng, nếu các thuộc tính tồn tại trong mô hình. Tôi sử dụng hàm property_exists() để kiểm tra mô hình nếu nó có một thuộc tính cụ thể trước khi thiết lập nó. Khoá mảng và thuộc tính mô hình được mong đợi sẽ khớp, vì vậy đó là cách nó hoạt động.

Nó hoạt động tốt nếu mô hình đã có thuộc tính được đặt, bởi vì thuộc tính tồn tại và lấy giá trị từ mảng đó. Nhưng không có gì sẽ được cập nhật hoặc thiết lập nếu thuộc tính trước đây là null, vì nó không kiểm tra thuộc tính property_exists().

Điều cuối cùng xảy ra là tôi có một mảng thuộc tính duy nhất và sau đó có thể là hai mô hình. Và tôi chạy hàm setter của mình, truyền vào mảng thuộc tính và mỗi đối tượng trong các cuộc gọi riêng biệt. Nếu mô hình có thuộc tính phù hợp, mô hình sẽ được cập nhật.

+1

thử $ model-> getAttributes() –

+0

Không có suy nghĩ nào về câu trả lời của tôi? –

Trả lời

11

Dưới đây là hai cách để làm điều này. Một phương pháp là xác định các giá trị thuộc tính mặc định trong mô hình của bạn.

protected $attributes = ['column1' => null, 'column2' => 2]; 

Sau đó, bạn có thể sử dụng phương thức getAttributes() để lấy các thuộc tính của mô hình.

Nếu bạn không muốn đặt thuộc tính mặc định, tôi đã viết một phương thức nhanh sẽ hoạt động.

public function getAllAttributes() 
{ 
    $columns = $this->getFillable(); 
    // Another option is to get all columns for the table like so: 
    // $columns = \Schema::getColumnListing($this->table); 
    // but it's safer to just get the fillable fields 

    $attributes = $this->getAttributes(); 

    foreach ($columns as $column) 
    { 
     if (!array_key_exists($column, $attributes)) 
     { 
      $attributes[$column] = null; 
     } 
    } 
    return $attributes; 
} 

Về cơ bản, nếu thuộc tính chưa được đặt, điều này sẽ thêm giá trị null vào thuộc tính đó và trả lại cho bạn dưới dạng mảng.

+0

mục tiêu là đặt giá trị rỗng thành null, cách đơn giản nhất là nối thêm '-> nullable()' vào trường trong quá trình di chuyển. Bạn không cần phải viết một phương thức mới hoặc đặt nó trong mô hình. không phải là cần thiết – tam5

+0

Mục đích là để anh ta có thể nhận được tất cả các thuộc tính khi chúng chưa được thiết lập, và cách duy nhất để làm điều đó là thiết lập các giá trị thành null (hoặc một số giá trị mặc định khác) –

+0

Ít nhất, bởi vì chúng tôi không thể nhìn thấy bất kỳ mã nào, tôi giả định rằng anh ta đang làm việc với một cá thể rỗng vì anh ta nói 'getAttributes()' không hoạt động. Ví dụ: '$ user = new User; $ user -> getAttributes(); 'sẽ không r các thuộc tính eturn vì nó không được thiết lập. –

0

Cập nhật:

Nếu bạn đang cố gắng để làm điều này sau khi instantiating như vậy:

$model = new Model; 

sau đó xin vui lòng khác nhau để trả lời Thomas Kim.

Nếu không: Bạn có thể sử dụng phương pháp toArray() hoặc getArributes() trên ví dụ mẫu, sẽ trả lại tất cả các thuộc tính bao gồm cả giá trị rỗng. Sau đó, bạn có thể sử dụng array_key_exists để kiểm tra.

Giống như vậy:

if (array_key_exists('foo', $model->getAttributes())) { 
    $model->foo = 'new value'; 
} 
+0

Tôi đã thử tạo mô hình mới và khi thử một trong các chức năng đó, tôi nhận được một mảng trống. Tôi nghĩ rằng điều đó nên được mong đợi mặc dù. Từ tài liệu cho getAttributes() ít nhất, nó nói "Nhận tất cả các thuộc tính hiện tại trên mô hình." – kenshin9

+0

Bạn đã khởi tạo trong dự án của mình hay chỉ trong tinker? – tam5

+0

Xin lỗi, tôi đã không nghĩ đến điều đó. Tôi đã thực hiện nó ngay trong dự án của mình" – kenshin9

0
$model->getAttributes(); 

Trên sẽ trả về một mảng các thuộc tính thô (như lưu trữ trong bảng cơ sở dữ liệu)

$model->toArray() 

Trên sẽ trả lại toàn bộ của mô hình thô, biến đổi (nếu sử dụng), và nối các thuộc tính

Hy vọng nó sẽ hữu ích !!

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