2013-01-08 38 views
2

我在CakePHP的新手,現在我卡在多對多的情況CakePHP的多對多的條件

好吧,我有3個表:

  1. 問題 與字段(ID ,問題)
  2. question_product 與字段(ID,question_id,PRODUCT_ID,QUESTION_NUMBER,is_enabled)
  3. 產品 與字段(ID,名稱,代碼,is_enabled)

所以當我要選擇具有特定領域的問題,我不知道如何解決它 現在,我的代碼是這樣的:

Question.php(型號)

class Question extends AppModel { 

    public $hasAndBelongsToMany = array (
     'Product' => array (
      'joinTable' => 'question_product', 
      'foreignKey' => 'question_id', 
      'associationForeignKey' => 'product_id', 
      'unique' => 'keepExisting', 
      'order' => 'question_number', 
      'fields' => array (
       'QuestionProduct.question_number', 
       'Product.id', 
       'Product.name' 
      ), 
      'conditions' => array (
       'QuestionProduct.is_enabled' => 1, 
      ) 
     ) 
    ); 
} 

QuestionsController.php(控制器)

public function loadQuestions($productId) { 
    $this->view = 'load_questions'; 
    $questions = $this->Question->find('all', array (
     'fields' => array (
      'Question.id', 
      'Question.question', 
      'Question.is_optional', 
      'Question.reason_optional', 
      'Question.text_size' 
     ), 
     'conditions' => array (
      'QuestionProduct.product_id' => $productId 
     ) 
    )); 
    $this->set($questions); 
} 

方法loadQuestions有一個參數與指定的產品

選擇

,如果我使用SQL查詢,這將是這個樣子

從問題與條件PRODUCT.PRODUCT_ID = 4,通過QuestionProduct.question_number人354

select questions.* 
from questions 
join question_product on questions.id=question_product.question_id 
join products on products.id=question_product.product_id 
where products.id=4 
order by question_product.question_number; 

任何答案全部選擇可以理解的:)

謝謝!

+0

我不明白這個問題。你能澄清問題是什麼以及你想完成什麼? – jeremyharris

+0

@jeremyharris謝謝你的回覆..我已經添加了sql查詢,可能你有我的線索:) – Naman

回答

1

無論何時,當您使用與任何其他需要條件的字段之間的許多(HABTM)關係時,就Cake而言,它已經不再是很多了。您希望HasManyThrough relationship

0

而不是使用hasAndBelongsToMany關係,使用兩個belongsTO關係從question_product問題,另一次從question_product產品

question_product belognsTo問題

question_product屬於關聯產品

注意:你應該從question_product更改表名question_products作爲CakePHP的約定

模型中的

QuestionProduct模型:

<?php 

// declares a package for a class 
App::uses('AppModel', 'Model'); 

class QuestionProduct extends AppModel { 

/** 
* @see Model::$actsAs 
*/ 
    public $actsAs = array(
     'Containable', 
    ); 

/** 
* @see Model::$belongsTo 
*/ 
    public $belongsTo = array(
     'Product' => array(
      'className' => 'Product', 
      'foreignKey' => 'product_id', 
     ), 
     'Question' => array(
      'className' => 'Question', 
      'foreignKey' => 'question_id', 
     ), 
    ); 

然後在你的控制器:

public function loadQuestions($productId) { 
    $this->view = 'load_questions'; 
    $questions = $this->QuestionProduct->find('all', array (
     'fields' => array (
      'Question.id', 
      'Question.question', 
      'Question.is_optional', 
      'Question.reason_optional', 
      'Question.text_size' 
     ), 
     'conditions' => array (
      'QuestionProduct.product_id' => $productId 
     ), 
     'contain' => array('Product','Question') 
    )); 
    $this->set($questions); 
} 

它應該正是你想要的查詢,我不認爲它有任何其他方式產生的查詢。