sql >> Databasteknik >  >> RDS >> Mysql

CakePHP - Söker 3 bord effektivt med JOIN

Jag föredrar mindre kod med tårtmodell/bordsnamnkonvention (db-tabell products - modellnamn Product , db-tabell prices - modellnamn Price ) för vidare projektledning. Det ser ut som att du vill göra:

$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
    ),

 ));

men om Du vill få produkter med Dina alla kriterier (företag och pris) endast , Du bör använda INNER JOIN , och GROUP BY Produkt (group alternativ).

Dessutom, om du vill få alla produkter med många priser och företagsresultat och du ställer in/länkar modellrelationer, kan du använda contain alternativ, som:

$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),
    // ...
)); 

Så du kommer att få alla produkter med feature => $product_feautre , och du får LEFT JOIN företag och priser på dessa produkter.

Hoppas detta hjälper.




  1. Varför ska jag inte infoga serialiserade arrayer i mitt databasfält?

  2. @BatchSize en smart eller dum användning?

  3. SQL Server Databas Size Growth med hjälp av Backup-historik

  4. Unicode-normalisering i PostgreSQL 13