2012-02-21 3 views
8

Sử dụng Yii, làm cách nào tôi có thể lấy mảng từ Bản ghi Hoạt động.Yii - Cách lấy mảng giá trị từ Bản ghi Hoạt động

Nói cái gì đó như thế này:

array('foo', 'bar', 'lala')

Từ một cái gì đó như thế này:

MyTable::model()->findall() 
+0

foo, bar và lala là gì? thuộc tính của một bảng/mô hình hoặc các đối tượng mô hình khác nhau? –

+0

là bạn đang cố gắng hỏi làm thế nào bạn có thể sử dụng điều kiện, params vv cho findAll chức năng? – Arfeen

+0

Giá trị. Tôi muốn nhận được một mảng o giá trị từ một bảng. Ví dụ: một mảng các quốc gia nằm ngoài bảng chứa quốc gia. – Marian

Trả lời

0

Không sử dụng ActiveRecord. Sử dụng các lớp CDBCommand->queryColumn()

+0

Meh ... Django có: https://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list Tại sao Yii không thể có điều đó? – Marian

+1

Nếu bạn đang sử dụng bất kỳ phương thức beforeFind hoặc afterFind nào cho ActiveRecord của bạn, điều này sẽ (rõ ràng) không gọi cho chúng. Ví dụ, tôi đã làm một số prefiltering trong một beforeFind mà không được gọi trong queryColumn, vì vậy chúng tôi đã nhận được kết quả nhiều hơn mong đợi. May mắn thay, chúng tôi đã có một số thử nghiệm tại chỗ để nắm bắt những thứ như thế này, nếu không điều này sẽ làm tổn thương chúng tôi xuống đường trong sản xuất. –

+2

câu hỏi đặt ra là lấy dữ liệu thực tế ra khỏi MyTable :: model() -> findall(); Vì vậy, câu trả lời là không liên quan –

24

Nếu tôi hiểu bạn một cách chính xác:

$users = User::model()->findAll(); 
$usersArr = CHtml::listData($users, 'id' , 'name'); 
print_r($usersArr); 

Nó sẽ cho bạn mảng id = > tên

Array { 
    2 => 'someone', 
    20 => 'kitty', 
    102 => 'Marian', 
    // ... 
} 
+0

Vâng, tôi nghĩ về điều đó, nhưng không phải là có một cách để sử dụng chỉ là 'tên'? – Marian

+0

Chìa khóa không phải là vấn đề nếu bạn chỉ muốn sử dụng tên? Bạn có thể sử dụng array_values ​​để thiết lập lại các phím nếu bạn muốn. –

+1

Neah .. nó không hoạt động như thế .. – Marian

3

Bạn cũng có thể làm điều gì đó như

$countries = Country::model()->findAll(); 
array_values(CHtml::listData($countries, 'country_id', 'country_name')); 

mà trả về một mảng của tất cả các tên quốc gia hoặc

array_keys(CHtml::listData($countries, 'country_id', 'country_name')); 

trả về một mảng của tất cả các id quốc gia.

0

Sử dụng Chtml cho điều này là một Ugly Hack! Áp dụng giải pháp này là cách tốt hơn để này mà tôi tìm thấy:

public function queryAll($condition = '', $params = array()) 
{ 
    $criteria = $this->getCommandBuilder()->createCriteria($condition, $params); 
    $this->applyScopes($criteria); 
    $command = $this->getCommandBuilder()->createFindCommand($this->getTableSchema(), $criteria); 
    $results = $command->queryAll(); 
    return $results; 
} 

Bạn có thể thêm mã này vào một lớp ActiveRecord, ví dụ:

class ActiveRecord extends CActiveRecord { 
//... 
} 

Và, sử dụng theo cách này:

return $model->queryAll($criteria); 

Bạn có thể đọc thêm trong số this link.

+0

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

1

Làm thế nào về:

Yii::app()->db->createCommand() 
    ->setFetchMode(PDO::FETCH_COLUMN,0) 
    ->select("mycolumn") 
    ->from(MyModel::model()->tableSchema->name) 
    ->queryAll(); 

Kết quả sẽ là:

array('foo', 'bar', 'lala') 
5

Đối yii2, sử dụng:

yii\helpers\ArrayHelper::map(MyModel::find()->all(), 'id', 'name')); 

hoặc

yii\helpers\ArrayHelper::getColumn(MyModel::find()->all(), 'name')); 
0

nếu bạn đang sử dụng Yii1.1 và bạn cần nhận được TẤT CẢ dữ liệu từ AR dưới dạng mảng bạn cần quan tâm về nó. Yii1.1 AR không có tính năng này ra khỏi hộp

Trong Yii2 AR có asArray() phương pháp, nó rất hữu ích

Tôi hy vọng câu trả lời của tôi sẽ giúp người

+0

Cung cấp một ví dụ có thể giúp tốt hơn một chút. –

1

Sử dụng Yii2 ArrayHelper bằng cách bao gồm để điều khiển của bạn này sẽ chuyển đổi dữ liệu mô hình thành một mảng được liên kết

use yii\helpers\ArrayHelper; 

    $post = ArrayHelper::toArray(ClientProfilesForm::findOne(['id' => 1])); 

//or use it directly by 

    $post = yii\helpers\ArrayHelper::toArray(ClientProfilesForm::findOne(['id' => 1]));