3

我是 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 查询,它会是这样的

从 Question 中选择所有条件 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;

任何答案将不胜感激:)

谢谢 !

4

2 回答 2

2

任何时候你在任何其他需要条件的字段中使用多对多 (HABTM) 关系,就 Cake 而言,它不再是多对多。你想要HasManyThrough 关系

于 2013-01-09T08:48:49.200 回答
2

不要使用hasAndBelongsToMany关系,而是使用从question_productquestionsbelongsTO的两个关系,以及另一个从question_productproducts的关系。

question_product 属于问题

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

它应该准确地进行您想要的查询,我认为它没有任何其他方式来生成该查询。

于 2013-01-11T07:54:24.493 回答