2015-05-07 17 views
6

Ho un modulo che raccoglie dati su un articolo e desidero salvare tali dati, nonché un modello denominato Abstract, in cui un articolo contiene molti abstract. I miei modelli simile a questa:Salvataggio di modelli associati in Cakephp 3

namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class AbstractsTable extends Table 
{ 
public function initialize(array $config) 
{ 
    $this->belongsTo('Articles'); 
} 

public function validationDefault(Validator $validator) 
{ 
    $validator 
     ->notEmpty('body'); 
    return $validator; 
} 
} 

E

namespace App\Model\Table; 

use Cake\ORM\Table; 
use Cake\Validation\Validator; 

class ArticlesTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     $this->addBehavior('Timestamp'); 
     $this->hasMany('Abstracts'); 
    } 

public function validationDefault(Validator $validator) 
    { 
     $validator ->notEmpty('category') 
     return $validator; 
    } 
} 

mio modulo di ingresso ha un campo denominato 'abstracts.body', e nella mia ArticlesController ho questa funzione:

public function add() 
    { 
      $data = $this->request->data; 
      $article = $this->Articles->newEntity($data, [ 
          'associated' => ['Abstracts'] 
        ]); 
     if ($this->request->is('post')) { 
        $article->user_id = $this->Auth->user('id'); 
        $data['abstracts']['user_id'] = $article->user_id; 
        $data['abstracts']['approved'] = 0; 
        $article = $this->Articles->patchEntity($article, $data, [ 
           'associated' => ['Abstracts'] 
          ]); 

      if ($this->Articles->save($article, [ 'validate' => false, 
                'associated' => ['Abstracts'] 
               ])) 
       { 
         $this->Flash->success(__('Your article has been saved.')); 
         return $this->redirect(['action' => 'index']); 
       } 
      $this->Flash->error(__('Unable to add your article.')); 
      } 
      $this->set('article', $article); 
    } 

Il mio tavolo Abstracts è piuttosto semplice:

CREATE TABLE 'abstracts' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'article_id' INTEGER , 'user_id' INTEGER , 'body' TEXT, 'approved' BOOLEAN) 

Dal debug posso vedere che ho la corretta matrice di 'abstract' all'interno dei miei $ data (in add()), ma non sembra che abbia mai provato a salvarlo nel database. Qualcuno può indicare il mio errore? Grazie!

+0

mostra un 'debug ((stringa) $ articolo)' prima di chiamare save, per favore –

+0

Salvato il mio giorno :) The patchEntity() con il bit associato. –

risposta

3

Si sta postando l'array $ data ['abstract'] in modo errato e l'associazione non viene salvata. $ data ['abstract'] dovrebbe essere una matrice di Abstracts. Il tuo problema sta qui:

$data['abstracts']['user_id'] = $article->user_id; 
$data['abstracts']['approved'] = 0; 

si dovrebbe essere in grado di risolvere il problema abbastanza facilmente modificando questo:

foreach($data['abstracts'] as $index => $abstract) { 
    $abstract['user_id'] = $article->user_id; 
    $abstract['approved'] = 0; 
    $data['abstracts'][$index] = $abstract; 
} 

Questo dovrebbe correttamente scorrere sopra la vostra serie di abstract, impostare l'user_id e approvato i tasti in modo appropriato e quindi dovrebbe salvare correttamente.

CakePHP 3.x Documentation on Saving Associations

EDIT: questione molto interessante. Provatelo senza usare patchEntity, e utilizzare newEntity di per sé, invece:

public function add() 
{ 

    if ($this->request->is('post')) { 
     $data = $this->request->data; 

     // Post process abstracts objects 
     foreach($data['abstracts'] as $index => $abstract) { 
      $abstract['user_id'] = $article->user_id; 
      $abstract['approved'] = 0; 
      $data['abstracts'][$index] = $abstract; 
     } 

     // Build newEntity 
     $article = $this->Articles->newEntity($data, [ 
      'associated' => ['Abstracts'] 
     ]); 

     // Save our entity with associations 
     if ($this->Articles->save($article, [ 
      'validate' => false, 
      'associated' => ['Abstracts'] 
     ])) { 
      $this->Flash->success(__('Your article has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } 

     // On save fail 
     $this->Flash->error(__('Unable to add your article.')); 
     $this->set('article', $article); 
    }  
}  

EDIT 2: Il tuo problema sembra che sia sicuramente nel modulo aiutante. Il vostro contributo sotto forma aiutante corrente crea un array $ dati che assomiglia a questo:

$data = [ 
    'abstracts' => [ 
     'body' => 'example text' 
    ], 
    'category' => 'Science' 
]; 

che dovrebbe apparire come:

$data = [ 
    'abstracts' => [ 
     ['body' => 'example text'], 
     ['body' => 'Im your second abstract'], 
     ['body' => 'Abstract three!'] 
    ], 
    'category' => 'Science' 
]; 

Il problema sta nel:

abstracts.body 

Che va letta come (in notazione dot array):

// abstracts.0.body 
echo $this->Form->input('abstracts.0.body', [ 
    'label' => 'summary of article', 
    'maxlength' =>'440', 
    'rows' => '7' 
]); 

Credo che dovrebbe essere l'ultimo problema in cui ti imbatti.

+0

Ancora non funziona. Non penso che tu abbia ragione nel senso che il mio problema è lì (o per lo meno, il mio UNICO problema non c'è). Lo so perché posso commentare l'intera sezione e non lo inserisce ancora. Per esempio. // $ data ['abstract'] ['user_id'] = $ article-> user_id; // $ data ['abstract'] ['approved'] = 0; Si comporta esattamente allo stesso modo. Il mio modulo assomiglia a: echo $ this-> Form-> input ('abstracts.body', ['label' => 'riassunto di articolo', 'maxlength' => '440', 'rows' => '7']); – km27

+0

Controlla la mia modifica alla mia risposta e, se questa soluzione non funziona, pubblica una copia debug() dell'array $ data prima dell'elaborazione e dopo l'elaborazione. –

+0

Inoltre, questo potrebbe essere irrilevante, ma controlla la proprietà $ _accessible in AbstractEntity.php, potresti non avere la tua proprietà 'body' impostata su accessibile per l'impostazione tramite l'assegnazione di massa (con newEntity e patchEntity). Non credo che questo sia il caso perché hai "validate => false" impostato sulla funzione di salvataggio, ma non sono sicuro se questo disattiva anche la convalida per le entità associate. –

4

Capito.

ho iniziato ad andare male qui:

My input form has a field named 'abstracts.body' 

Perché è un rapporto hasMany, ho bisogno di avere tale ingresso sia 'abstracts.0.body '

Quindi il resto della risposta di LeWestopher funzionerà-- aggiungendo un indice ai campi che voglio compilare dal controller, quindi $ data [abstract] [0] [' user_id '] => ... e così via. Grazie!

+0

Perfetto! Sono contento che tu l'abbia capito. –

Problemi correlati