2012-02-21 12 views
8

Utilizzando Yii, come posso ottenere un array da un record attivo.Yii - Come ottenere un array di valori da un record attivo

dire qualcosa del genere:

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

Da qualcosa di simile:

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

cosa sono foo, bar e lala? attributi di una tabella/modello o diversi oggetti del modello? –

+0

stai cercando di chiedere come potresti usare condizioni, parametri ecc per trovare la funzione Tutte? – Arfeen

+0

Valori. Voglio ottenere un array di valori da una tabella. Ad esempio una serie di paesi fuori da una tabella che contiene paesi. – Marian

risposta

0

Non utilizzare ActiveRecord. Utilizzare CDBCommand->queryColumn()

+0

Meh ... Django ha questo: https://docs.djangoproject.com/en/dev/ref/models/querysets/#values-list Perché Yii non può farlo anche tu? – Marian

+1

Se stai usando i metodi beforeFind o afterFind per il tuo ActiveRecord, questo (ovviamente) non li chiamerà. Ad esempio, stavo facendo un prefiltraggio in un beforeFind che non veniva chiamato in queryColumn, quindi ottenevamo più risultati del previsto. Fortunatamente abbiamo fatto alcuni test per prendere cose del genere, altrimenti questo ci avrebbe ferito lungo la strada in produzione. –

+2

la domanda riguarda l'acquisizione di dati effettivi da MyTable :: model() -> findall(); Quindi, la risposta è irrilevante –

24

se ho capito si correttamente:

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

vi darà serie id = > nome

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

Sì, ci ho pensato, ma non c'è un modo per usare solo il 'nome'? – Marian

+0

La chiave non dovrebbe essere un problema se si desidera solo utilizzare il nome? Puoi usare array_values ​​per resettare i tasti se vuoi. –

+1

Neah .. non funziona così .. – Marian

3

Si potrebbe anche fare qualcosa di simile

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

che restituisce un array di tutti i nomi dei paesi, o

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

che restituisce una matrice di tutti gli ID di paese.

0

Utilizzare Chtml per questo è un brutto attacco! Applicare questa soluzione è il modo migliore per questo che ho trovato:

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

È possibile aggiungere questo codice a una classe ActiveRecord, per esempio:

class ActiveRecord extends CActiveRecord { 
//... 
} 

E, utilizzare in questo modo:

return $model->queryAll($criteria); 

Ulteriori informazioni sono disponibili al numero this link.

+0

Si noti che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate, pertanto le risposte devono essere il punto finale di una ricerca di una soluzione (vs. ancora un altro scalo di riferimenti, che tendono a diventare stantii nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

1

ne dite:

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

il risultato sarebbe:

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

Per yii2, uso:

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

o

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

se stai usando Yii1.1 e hai bisogno di ottenere TUTTI i dati da AR come array di cui ti devi preoccupare. Yii1.1 AR non ha questa caratteristica, fuori dalla scatola

In Yii2 AR ha asArray() metodo, è molto utile

Spero che la mia risposta aiuta qualcuno

+0

Fornire un esempio può aiutare un po 'meglio. –

1

Utilizzare il Yii2 ArrayHelper includendo al controller questo convertirà un modello dati in un array associato

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])); 
Problemi correlati