Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Это будет сделано:

$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() - и-loop.

Ответ 2

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

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

Это используется, когда у вас есть сложные запросы, которые трудно создать с помощью соглашений Yii.

Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();

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

Ответ 3

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

$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name');

Ответ 4

Простой и простой способ: я использую 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',
)

Ответ 5

$model = Trips::model()->findAll(); 
$arr = CHtml::listData($model, 'trip_id', 'trip_name');
var_dump($arr);

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

Ответ 6

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

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

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

Ответ 7

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

$collections = new CMap();
foreach (YourModel::model()->findAll(['index' => 'id']) as $key => $row) {
   $collections->add($key,$row->attributes);
}
var_dump($collections ->toArray());

Ответ 8

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

$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
                 ) 
    )

Ответ 9

$cats = Category::model()->findAll();
$count_cats = count($cats);
if($count_cats > 0){
    $arr_category = array();
    foreach($cats as $cat)
        array_push($arr_category,$cat->attributes);
}
print_r($arr_category);

- > результат

Array(
[0] => Array
    (
        [cat_id] => 2
        [title] => Đương đại
        [title_full] => Đương đại
        [desc] => 
        [alias] => duong-dai
        [p_id] => 0
        [type] => 1
        [status] => 1
        [sort_order] => 2
        [selected] => 0
    )
[1] => Array
    (
        [cat_id] => 164
        [title] => Nhiệt đới
        [title_full] => Nhiệt đới
        [desc] => 
        [alias] => nhiet-doi
        [p_id] => 0
        [type] => 1
        [status] => 1
        [sort_order] => 0
        [selected] => 0
    )
[...])

Ответ 10

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

CHtml::listData(Trips::model()->findAll(), 'id', 'attributes')

Ответ 11

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

Ответ 12

Использовать DAO для массивов

$array = Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();

Ответ 13

Не используйте CHtml:: listData для этого. Он должен использоваться для других целей. Существует свойство index для CDbCriteria, которое подходит для вас.

//1st option
Trips::model()->findAll(array('index'=>'trip_id'));

//2nd option
$c = new CDbCriteria();
$c->index = 'trip_id';
Trips::model()->findAll($c);