sql >> Databáze >  >> RDS >> Mysql

CakePHP - Efektivní prohledávání 3 stolů pomocí JOIN

Dávám přednost méně kódu s konvencí pojmenování modelu dortu/tabulky (tabulka db products - název modelu Product , db tabulka prices - název modelu Price ) pro další řízení projektu. Vypadá to, že chcete udělat:

$results = $this->Product->find('all', array(
    'fields' => array(
        'Company.name',
        'Product.feature',
        'Price.price'
    ),
    'joins' => array(
        'LEFT JOIN companies AS Company ON Product.company_id = Company.id
         LEFT JOIN prices AS Price ON Product.id = Price.product_id'
    ),
    'conditions' => array(
        'Company.name LIKE' => '%'.$search_term.'%',
        'Product.feature' => $product_feature,
        'Price.price <' => $price
    ),

 ));

ale pokud Chcete získat produkty s Vaše všechna kritéria (společnost a cena) pouze , Měli byste použít INNER JOIN a GROUP BY Produkt (group možnost).

Také, pokud chcete získat všechny produkty s mnoha cenami a výsledky společností a nastavíte/propojíte modelové vztahy, můžete použít contain možnost, jako:

$contain = array(
    'Company' => array(
        // ...
        'conditions' => array('Company.name LIKE' => '%'.$search_term.'%'),
        // ...
    ),
    'Price' => array(
        // you can set: 'fields' => array('id', ...),
        'conditions' => array('Price.price <' => $price),
        // you can set order: 'ordder' => '....'                
    )
);

$this->Product->attach('Containable');
$post = $this->Product->find('all', array(
    // ...
    'contain' => $contain,
    'conditions' => array('Product.feature' => $product_feature),
    // ...
)); 

Získáte tedy všechny produkty s feature => $product_feautre a získáte LEFT JOIN společnosti a ceny těchto produktů.

Doufám, že to pomůže.




  1. Oznámení MySQL 5.6 EOL

  2. Nelze se připojit k serveru mysql pomocí go and docker - vytočte tcp 127.0.0.1:3306:connect:připojení odmítnuto

  3. Jak najdu umístění MySQL my.cnf

  4. Jak vybrat datum bez času v SQL