2016-08-31 10 views
0

Je les modèles suivants:CakePhp: Trouvez en utilisant Contenir avec état

  1. Company (id, nom)
  2. employé (id, nom, company_id, isRemoved) [Société a beaucoup d'employés]

Dans l'association spécifiée, l'employé a une condition par défaut, que

public $hasMany = array(
     'Employee' => array(
     'className' => 'Employee', 
     'foreignKey' => 'company_id', 
     'dependent' => true, 
     'conditions' => array(
      'Employee.isRemoved' => 0 
     ), 
    ) 
); 

l'association a une condition par défaut d'un employé n'étant pas supprimée. J'utilise la Recherche requête suivante sur la compagnie pour obtenir que les employés dont le nom correspond à une chaîne:

$this->Company->find('all', array(
    'contain' => array(
     'Employee' => array(
      'conditions' => array(
       'Employee.name LIKE' => '%'.$search_text.'%') 
      ), 
      'fields' => array('Employee.id, Employee.name') 
     ) 
    ) 
)); 

Le problème que je suis face est que, lorsque j'utilise conditions à l'intérieur contiennent, la condition par défaut spécifiée dans l'association est non appliqué et lorsque la clé de conditions n'est pas spécifiée, la condition par défaut spécifiée dans l'association est appliquée.

Est-ce un comportement par défaut de Cakephp et comment procéder à ce sujet? J'utilise Cakephp 2.8.4

Répondre

1

Je ne peux pas vous dire si les conditions dans le modèle en cours d'écrasement sont le comportement par défaut de CakePHP. Je peux cependant vous proposer une alternative possible:

En utilisant le rappel beforeFind() dans votre modèle, vous pouvez ajouter votre condition 'Employee.isRemoved' => 0.

Donc, dans votre modèle Company que vous pourriez faire quelque chose comme:

function beforeFind(array $queryData) { 
    if(isset($queryData['contain']['Employee'])) { 
     //Notice the extra [] to not overwrite the conditions set in the controller 
     $queryData['contain']['Employee']['conditions'][]['Employee.isRemoved'] = 0; 
    } 
    return $queryData; 
} 

Disclaimer: Je n'ai pas testé ce code.

Source: https://stackoverflow.com/a/17544106/6786476