2011-07-18 1 views
-1

J'ai ces tables dans ma base de données: 'products' appartient à une 'company', et 'company' a beaucoup 'company_addresses'. Et je construis une action de recherche dans mon contrôleur qui retournera les produits basés sur l'adresse de l'entreprise entrée par l'utilisateur. Comment puis-je obtenir quelque chose comme le suivant?CakePHP 3 méthode de recherche de jointure de niveau

SELECT * 
FROM products 
LEFT JOIN companies ON products.company_id = companies.id 
LEFT JOIN company_addresses ON companies.id = company_addresses.company_id 
WHERE company_addresses.address1 LIKE '%'.$this->data['Product']['keyword'].'%' 
OR company_addresses.address2 LIKE '%'.$this->data['Product']['keyword'].'%' 

Cela ne semble pas fonctionner:

$results = $this->Product->find('all', array(
    'conditions' => array(
     'OR' => array(
      array('CompanyAddress.address1 LIKE' => '%'.$this->data['Product']['keyword'].'%'), 
      array('CompanyAddress.address2 LIKE' => '%'.$this->data['Product']['keyword'].'%') 
     ) 
    ), 
    'order' => array(
     'Product.id' => 'ASC' 
    ), 
    'contain' => array(
     'Company' => array(
      'CompanyAddress' => array(
       'State', 
       'City' 
      ) 
     ) 
    ) 
)); 

Ni ceci:

$results = $this->Product->find('all', array(
    'order' => array(
     'Product.id' => 'ASC' 
    ), 
    'contain' => array(
     'Company' => array(
      'CompanyAddress' => array(
       'conditions' => array(
        'OR' => array(
         array('CompanyAddress.address1 LIKE' => '%'.$this->data['Product']['keyword'].'%'), 
         array('CompanyAddress.address2 LIKE' => '%'.$this->data['Product']['keyword'].'%') 
        ) 
       ), 
       'State', 
       'City' 
      ) 
     ) 
    ) 
)); 

Répondre

0

Je pense que le mieux pour vous est d'utiliser la jointure de CakePHP.

Quelque chose comme ceci:

$this->Product->find('all', array(
          'joins' => array(
           array(
            'table' => 'companies', 
            'alias' => 'Company', 
            'type' => 'left', 
            'conditions' => array(
             'Company.id = Product.company_id' 
            ), 
           ), 
           array(
            'table' => 'companies_addresses', 
            'alias' => 'CompaniesAddress', 
            'type' => 'left', 
            'conditions' => array(
             'CompaniesAdress.company_id = Company.id', 
             'OR' => array(
              'CompanyAdress.address1 LIKE' => '%' . $this->data['Product']['keyword'] . '%', 
              'CompanyAdress.address2 LIKE' => '%' . $this->data['Product']['keyword'] . '%', 
             ), 
            ), 
           ), 
          ), 
         ));