2015-05-10 25 views
6

Voglio aggiungere record a una tabella con ActiveRecord.Yii2: get raw sql di model-> save()

Ecco il mio codice:

$model = new Article(); 
$model->title = 'test title'; 
$model->content = 'test content'; 
$model->category_id = 1; 
$model->author_id = 1; 
if ($model->validate()) { 
    $model->save(); 
} 

$model->validate() rendimenti true, ma $model->save() rendimenti false.

Come trovare sql raw generati da $model->save()?

frattempo:

$model->save()->rawSql è null e $model->getErrors() ritorni array vuoto.

Nel debug, tutte le query vengono registrate, ma non ho trovato alcuna query di inserimento o aggiornamento.

+1

È possibile cercare in runtime/logs/app.log se si è in modalità di debug. Anche le query vengono registrate. – robsch

risposta

3

$model->save()->rawSql la chiamata non può restituire null, deve generare un'eccezione per cui si sta tentando di accedere alla proprietà di non oggetto. $model->save() restituisce il valore boolean - query eseguita correttamente o meno.

Se $model->getErrors() rendimenti array vuoto e interrogazione non è stato eseguito a tutti sono abbastanza sicuro che qualcosa non va con i gestori di eventi, in particolare il modello beforeSave(), verificarle, non dovrebbe return false. Controlla anche i gestori di eventi associati ai comportamenti.

Come per ottenere query. È inutile se semplicemente non è stato eseguito, ma se lo fosse, ecco alcuni modi per ottenerlo:

1) Probabilmente il modo migliore. Usa il pannello di debug. L'ho anche menzionato here.

2) Controllare i registri come @robsch consigliato.

Non è possibile ottenere direttamente codice SQL in codice con $model->save(), Verrà chiamato insert() o update(). Se siete interessati, qui è la parte di codice per insertInternal():

$values = $this->getDirtyAttributes($attributes); 
if (empty($values)) { 
    foreach ($this->getPrimaryKey(true) as $key => $value) { 
     $values[$key] = $value; 
    } 
} 
$db = static::getDb(); 
$command = $db->createCommand()->insert($this->tableName(), $values); 
if (!$command->execute()) { 
    return false; 
} 

Se si chiama $command->rawSql otterrete SQL prime, ma non si può fare al di fuori perché il comando si forma internamente.

P.S. questo pezzo di codice:

if ($model->validate()) { 
    $model->save(); 
} 

non ha senso, perché $model->save() chiamerà $model->validate() internamente.

+1

il problema proveniva da 'beforeSave' – ingenious