我是CakePHP的新手,现在我遇到很多情况
好的,我有3个表:
因此,当我想选择具有特定字段的问题时,我不知道如何解决它 现在,我的代码是这样的:
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(Controller)
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升序排序
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 :(得分:1)
任何时候你与需要条件的任何其他领域使用多人(HABTM)关系时,就Cake而言,它不再是很多。你想要HasManyThrough relationship
答案 1 :(得分:1)
不使用hasAndBelongsToMany
关系,而是使用 question_product 与问题之间的两个belongsTO
关系,以及 question_product 产品。
question_product belognsTo问题
question_product belongsTo产品
注意:您应该将表名从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);
}
它应该完全符合您想要的查询,我认为它没有任何其他方式来生成该查询。