2016-03-28 14 views
0

CakePHP adlandırma kurallarını izleyen bir HABTM ilişkisiyle bağlantılı olan 3 blog tablosum var: posts - post_tag_links - tags.CakePHP: backtick sorgusu ile normal sorgu arasındaki fark

Belirli bir etikete bağlı tüm yayınların (ör. "Tasarım") bir dizi oluşturmaya çalışıyorum. Bu sorgu benim için çalışıyor:, bu "sorguyu kullanmayın daha iyidir bazı en iyi uygulamayı yapmak

SELECT 
    Post.id, 
    Post.title 
FROM 
    posts AS Post 
LEFT JOIN 
    post_tag_links AS PostTagLink 
     ON Post.id = PostTagLink.post_id 
LEFT JOIN 
    tags AS Tag 
     ON Tag.id = PostTagLink.tag_id 
WHERE 
    Tag.slug = 'design' 
GROUP BY 
    Post.id 

AMA ...:

$this->Post->query(" 
    SELECT 
     Post.id, Post.title FROM posts AS Post 
    LEFT JOIN 
     post_tag_links AS PostTagLink ON Post.id = PostTagLink.post_id 
    LEFT JOIN 
     tags AS Tag ON Tag.id = PostTagLink.tag_id 
    WHERE 
     Tag.slug = 'design' 
    GROUP BY 
     Post.id" 
); 

CakePHP'nin sonra aşağıdaki sorgu oluşturur ve bana 4 sonuç verdi " yöntem. Bu yüzden "Tüm bulmak" yöntemi denedi:

$this->Post->find('all', array(
    'fields' => array(
     'Post.id', 
     'Post.title' 
    ), 
    'joins' => array(
     array(
      'table' => 'post_tag_links', 
      'alias' => 'PostTagLink', 
      'type' => 'LEFT', 
      'conditions' => array(
       'Post.id' => 'PostTagLink.post_id' 
      ) 
     ), 
     array(
      'table' => 'tags', 
      'alias' => 'Tag', 
      'type' => 'LEFT', 
      'conditions' => array(
       'Tag.id' => 'PostTagLink.tag_id', 
      ) 
     ) 
    ), 
    'conditions' => array(
     'Tag.slug' => 'design' 
    ), 
    'group' => 'Post.id' 
    ) 
)); 

CakePHP'nin sonra aşağıdaki sorgu oluşturur ve NO tek bir sonuç verdi: deneme yanılma bir sürü sonra

SELECT 
    `Post`.`id`, 
    `Post`.`title` 
FROM 
    `kattenbelletjes`.`posts` AS `Post` 
LEFT JOIN 
    `kattenbelletjes`.`post_tag_links` AS `PostTagLink` 
     ON (
      `Post`.`id` = 'PostTagLink.post_id' 
     ) 
LEFT JOIN 
    `kattenbelletjes`.`tags` AS `Tag` 
     ON (
      `Tag`.`id` = 'PostTagLink.tag_id' 
     ) 
WHERE 
    `Tag`.`slug` = 'design' 
GROUP BY 
    `Post`.`id 

, Sorunun keşfetti CakePHP'nin bu son sorguyu oluştururken oluşturduğu backticks.

Soruma soru: backticks ve backticks olmayan bir sorgu arasındaki fark nedir? Ve bu backtickleri CakePHP'de nasıl bırakabilirsin?

teşekkürler; tüm yaptıkları tanımlayıcıları kaçıyor gibi)

cevap

3

backticks büyük olasılıkla, sorun değil. Bu oldukça kolay bir btw.

gerçek sorun yaratan dize karşılaştırma koşulları var ne yaptığınızı, yanlış bir şekilde şartlarını tanımladığınıza daha olasıdır örneğin

`Post`.`id` = 'PostTagLink.post_id' 

PostTagLink.post_id dizesinin id sütun değerini karşılaştırmak elbette başarısız olacaktır. Ayrıca

tanımlayıcı karşılaştırmaları tanımlamak için doğru bir şekilde, yani, bunun yerine bir anahtar => değeri kümesinin tek bir değer olarak durumunun fragmanı tedarik

'conditions' => array(
    'Post.id = PostTagLink.post_id' 
) 

ve

olan
'conditions' => array(
    'Tag.id = PostTagLink.tag_id' 
) 

bakınız

+0

Bana bu kadar çabuk yardım edebileceğine sevindim çünkü oldukça uzun zamandır arıyordum. Çok teşekkür ederim ndm! – Sam