Yii модель для массива? - PullRequest
       59

Yii модель для массива?

31 голосов
/ 14 декабря 2010

Как я могу преобразовать результат Trips::model()->findAll() в массив?

Ответы [ 14 ]

34 голосов
/ 02 января 2011

Я предполагаю, что вам нужно извлечь только пустые массивы, а не любые связанные объекты модели.

Это сделает это:

$model = Trips::model();
$trips = $model->getCommandBuilder()
               ->createFindCommand($model->tableSchema, $model->dbCriteria)
               ->queryAll();

ЭтоЭто как Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); примеры, за исключением:

  • Он запросит у модели имя таблицы;вам не нужно будет указывать имя таблицы как в модели, так и в запросе.

  • Вы можете вызвать scoping функции сначала $model, например.
    $model = Trips::model()->short()->destination('Austin, TX');
    Это означает, что вы можете использовать существующие ярлыки запросов модели, вместо того, чтобы помещать их в запрос напрямую.

В отличие от $trips = Trips::model()->findAll(); (с использованиемforeach) немного расточительно, потому что вы извлекаете строки из базы данных, настраиваете кучу объектов, а затем отбрасываете их все.Это будет хорошо работать для небольших наборов результатов, но я бы не стал использовать это, если вы смотрите длинный список поездок.

Предупреждение:
Если это простобыстрый прототип, тем не менее, непременно используйте примеры createCommand() или findAll () - and-loop.

25 голосов
/ 15 декабря 2010

Это правильный способ, он следует соглашениям Yii

$trips = Trips::model()->findAll();
$arr = array();
foreach($trips as $t)
{
    $arr[$t->id] = $t->attributes;
}

Используется, когда у вас сложные запросы, те, которые вам трудно создать с соглашениями Yii.1006 * Например, когда вам нужно передать все данные из модели в массив.Вы не можете передать его напрямую, так как он передает некоторую информацию о данных ActiveRecord, которая вам не нужна.

13 голосов
/ 16 июня 2011

Это то же самое.

$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name');
6 голосов
/ 20 февраля 2014

Простой и простой способ: я использую listData () метод, чтобы сделать массив для выпадающих меню, и я думаю, что это поможет вам ... проверьте этот пример:

код:

<?php 
     /*you can use here any find method you think 
     proper to return your data from db*/
     $models = Trips::model()->findAll();

     // format models resulting using listData     
     $tripsArray = CHtml::listData($models, 'id', 'name');    

     print_r($tripsArray);
?>

вывод:

array(
 '1'=>'trip1',
 '2'=>'trip2',
 '3'=>'trip3',
)
4 голосов
/ 01 февраля 2011
$model = Trips::model()->findAll(); 
$arr = CHtml::listData($model, 'trip_id', 'trip_name');
var_dump($arr);

CHtml :: listData () вернет значение массива.

3 голосов
/ 19 марта 2015

Вы можете использовать это.

$Trips::model()->findAll(array('index'=>'trip_id'));
if(count($Trips)>0)
            {                   
                $TripsArrayList=array();
                foreach($Tripsas as $singleTrip)
                {                   
                    $TripsArrayList[]=array('trip_id'=>$singleTrip->trip_id,'name'=>$singleTrip->name);         
                }                   
            }

Ваш вывод будет

Array
    (
      [0] => Array
                 (
                   [trip_id] => 1
                   [name] => Nashik
                 )
      [1] => Array
                 (
                   [trip_id] => 2
                   [name] => Puna
                 ) 
      [2] => Array
                 (
                   [trip_id] => 3
                   [name] => Mumbai
                 ) 
    )
3 голосов
/ 28 июля 2014

Вы можете создавать коллекции CMap продолжать работать с ней

$collections = new CMap();
foreach (YourModel::model()->findAll(['index' => 'id']) as $key => $row) {
   $collections->add($key,$row->attributes);
}
var_dump($collections ->toArray());
3 голосов
/ 15 декабря 2010

Я уверен, что вы можете сделать это:

$trips = Trips::model()->findAll();
$arr = array();
foreach($trips as $t)
{
    $arr[$t->id] = $t->attributes;
}

Я предполагаю, что у вас есть атрибут 'id' в качестве первичного ключа вашей модели.

2 голосов
/ 28 октября 2013

Я использую $array = CJSON::decode(CJSON::encode($model)); для преобразования $ model в $ array.

2 голосов
/ 13 апреля 2013

Исходя из вашего вопроса о том, что вы хотите, чтобы все атрибуты были более компактным решением, чтобы предоставить вам все атрибуты, хэшированные по id, вы можете использовать псевдосвойство атрибутов CActiveRecord следующим образом:

CHtml::listData(Trips::model()->findAll(), 'id', 'attributes')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...