CakePHP有很多条件

时间:2013-01-08 10:11:58

标签: cakephp orm many-to-many cakephp-2.0

我是CakePHP的新手,现在我遇到很多情况

好的,我有3个表:

  1. 问题 有字段(id,问题)
  2. question_product with fields(id,question_id,product_id,question_number,is_enabled)
  3. 产品 with fields(id,name,code,is_enabled)
  4. 因此,当我想选择具有特定字段的问题时,我不知道如何解决它 现在,我的代码是这样的:

    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;
    

    任何答案将不胜感激:)

    谢谢!

2 个答案:

答案 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);
}

它应该完全符合您想要的查询,我认为它没有任何其他方式来生成该查询。