0

Event 模型有以下关系:

var $belongsTo = array(
    'Project' => array(
        'className' => 'Project',
        'foreignKey' => 'project_id',

    ),
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
    );

这是我根据用户输入列出事件的方式:

$conditions = array('user_id'=>$id, 'date >=' => $from, 'date <=' => $to);
$events = $this->find('all', array(
                                'conditions'=>$conditions, 'order' => array('Event.date' => 'asc')));

以下是正在运行的 3 个查询:

1   SELECT `User`.`id`, `User`.`name`, `User`.`surname` FROM `scheduling`.`users` AS `User` WHERE `company_id` = 1

2   SELECT `Project`.`id`, `Project`.`name` FROM `scheduling`.`projects` AS `Project` LEFT JOIN `scheduling`.`customers` AS `Customer` ON (`Project`.`customer_id` = `Customer`.`id`) WHERE `Project`.`company_id` = 1

3   SELECT `Event`.`id`, `Event`.`project_id`, `Event`.`user_id`, `Event`.`date`, `Event`.`hours`, `Event`.`minutes`, `Event`.`xhours`, `Event`.`xminutes`, `Event`.`xdetails`, `Event`.`assignment`, `Event`.`start_time`, `Event`.`material`, `Event`.`meter_drive`, `Event`.`time_drive`, `Event`.`start_location`, `Event`.`finish_time`, `Project`.`id`, `Project`.`name`, `Project`.`customer_id`, `Project`.`project_nr`, `Project`.`address`, `Project`.`post_nr`, `Project`.`city`, `Project`.`company_id`, `Project`.`color`, `Project`.`start_date`, `Project`.`finish_date`, `User`.`id`, `User`.`employee_nr`, `User`.`name`, `User`.`surname`, `User`.`email`, `User`.`password`, `User`.`role`, `User`.`phone`, `User`.`address`, `User`.`post_nr`, `User`.`city`, `User`.`token_hash`, `User`.`company_id`, `User`.`car_id`, `User`.`image` FROM `scheduling`.`events` AS `Event` LEFT JOIN `scheduling`.`projects` AS `Project` ON (`Event`.`project_id` = `Project`.`id`) LEFT JOIN `scheduling`.`users` AS `User` ON (`Event`.`user_id` = `User`.`id`) WHERE `user_id` = 1 AND `project_id` = 5 AND `date` >= '2013-07-01' AND `date` <= '2013-12-06' ORDER BY `Event`.`date` asc

事实上,我只需要第三个查询而不需要前两个。是什么导致它们以及如何摆脱它们?

4

4 回答 4

2

默认情况下,CakePHP 将尝试附加关联。

在所有 3 个模型中添加:

var $actsAs = array('Containable');

这将允许您将查询“包含”到特定模型。

现在你可以这样查询:

$events = $this->find('all', array(
                            'conditions'=>$conditions, 
                            'order' => array('Event.date' => 'asc'),
                            'contain' => true));

假设您确实希望用户(但不是项目)回来,您可以这样做:

$events = $this->find('all', array(
                            'conditions'=>$conditions, 
                            'order' => array('Event.date' => 'asc'),
                            'contain' => array('User')));
于 2013-09-19T09:39:51.910 回答
1

其他代码负责

这段代码:

$conditions = array('user_id'=>$id, 'date >=' => $from, 'date <=' => $to);
$events = $this->find('all', array(
    'conditions'=>$conditions, 
    'order' => array('Event.date' => 'asc')
));

负责此查询:

SELECT 
    `Event`.`id`, 
    ...
FROM 
    `scheduling`.`events` AS `Event` 
LEFT JOIN 
    `scheduling`.`projects` AS `Project` ON (`Event`.`project_id` = `Project`.`id`) 
LEFT JOIN 
    `scheduling`.`users` AS `User` ON (`Event`.`user_id` = `User`.`id`) 
WHERE 
    `user_id` = 1 AND 
    `project_id` = 5 AND 
    `date` >= '2013-07-01' AND 
    `date` <= '2013-12-06' 
ORDER BY 
    `Event`.`date` asc

但是,问题中的代码中只有user_id和条件。date

这个条件:

`project_id` = 5

被未显示的代码添加 - 可能是一种行为。检查您的代码中project_id定义条件的位置,就有答案了。

查询 #1 不相关

第一个查询看起来根本与问题中的代码无关 - 问题中没有任何内容需要查找用户的数据。要找到它的来源 - 您可以使用一种简单的技术。打开用户模型并将其放入其中:

class User extends AppModel {

    public function beforeFind() {
        debug(Debugger::trace());
        debug(func_get_args());
        die;
    }

}

这将给出查询是如何被触发的堆栈跟踪——一旦你知道它来自哪里,就适当地编辑应用程序代码。

查询 #2 是必需的

假设您想要的查询实际上是正确的(查找单个项目的所有事件) - 需要有一种方法来限制项目 ID。如果未明确指定,则第二个查询将通过客户端 ID 查找项目 ID - 即您想要的查询取决于该数据。

于 2013-09-19T09:33:19.007 回答
1

这将对您有所帮助。

$events = $this->find('all', array(
    'conditions'=>$conditions, 
    'order' => array('Event.date' => 'asc'),
    'recursive' => -1
));

基于最大包含深度的递归

于 2013-09-19T09:32:31.060 回答
0
$conditions = array('user_id'=>$id, 'date >=' => $from, 'date <=' => $to);
$events = $this->find('all', array('recursive'=>0,
     'conditions'=>$conditions, 'order' => array('Event.date' => 'asc')));

这里的变化是递归的

recursive=>-1 表示只获取事件

recursive=>0 表示将获取事件 + 它属于谁,在这种情况下是项目和用户

于 2013-09-19T11:30:01.080 回答