2017-03-31 2 views
0

Je souhaite pouvoir enregistrer des données tout en fournissant une clause where.Enregistrement des données à l'aide de la clause where

Je le code suivant:

$game = $this->Games->newEntity(); 
if ($this->request->is('post')) { 
    $game = $this->Games->patchEntity($game, $this->request->data); 
    if ($this->Games->save($game)) { 
     $this->Flash->success(__('The game has been saved.')); 

     return $this->redirect(['action' => 'index']); 
    } else { 
     $this->Flash->error(__('The game could not be saved. Please, try again.')); 
    } 
} 

J'ai essayé, mais ça n'a pas marché:

$this->Games->save($game)->innerJoinWith('Leagues', function ($q) use($s) { 
        return $q->where(['Leagues.user_id' => $s]); 
       } 
      ) 

Je pense avoir à faire retrouver avec une clause where et patcher la demande des données à ce sujet?

$game = $this->Games->find()->innerJoinWith('Leagues', function ($q) { 
    return $q->where(['Leagues.user_id' => $this->Auth->user('id')]); 
}) 
->where(['Games.id' => $id]) 
->first(); 

if(! count($game)){ 
    $this->Flash->error(__('The game could not be found.')); 
    return $this->redirect(['action' => 'index']); 
} 

if ($this->request->is('post')) { 
    $game = $this->Games->patchEntity($game, $this->request->data); 
    if ($this->Games->save($game)) { 
     $this->Flash->success(__('The game has been saved.')); 

     return $this->redirect(['action' => 'index']); 
    } else { 
     $this->Flash->error(__('The game could not be saved. Please, try again.')); 
    } 
} 

Rien de plus simple?

Répondre

1

Il n'y a pas de syntaxe de sauvegarde, retrouver la bonne entité au préalable est la bonne façon de procéder, et il n'y a pas vraiment de manière "plus simple", mais il y a sûrement de la place pour l'optimisation.

Personnellement j'utiliser viseurs pour DRY les choses, à savoir créer un viseur sur le GamesTable qui limite les choses aux utilisateurs de la ligue spécifiques:

public function findForLeagueUser(\Cake\ORM\Query $query, array $options) 
{ 
    if (!isset($options['id'])) { 
     throw new \InvalidArgumentException('The `id` option is invalid or missing.'); 
    } 

    return $query 
     ->innerJoinWith('Leagues', function (\Cake\ORM\Query $query) use ($options) { 
      return $query->where([ 
       $this->Leagues->aliasField('user_id') => $options['id'] 
      ]); 
     }); 
} 

et combiner les choses dans l'action du contrôleur:

$game = $this->Games 
    ->find('forLeagueUser', ['id' => $this->Auth->user('id')]) 
    ->where(['Games.id' => $id]) 
    ->first(); 

Vous pouvez également utiliser firstOrFail() à la place, ce qui déclenche une exception si l'enregistrement est introuvable, c'est ce que fait également Table::get() en interne.

Et vous pourriez réduire encore plus loin en utilisant un viseur dynamique pour l'ID jeux:

$game = $this->Games 
    ->findById($id) 
    ->find('forLeagueUser', ['id' => $this->Auth->user('id')]) 
    ->first(); 

Voir aussi

+0

Merci pour la perspicacité! – TekiusFanatikus