代码之家  ›  专栏  ›  技术社区  ›  Stephen

为什么CakePHP会复制我的查询?(这与通常提出的“查询过多”问题不同)

  •  1
  • Stephen  · 技术社区  · 14 年前

    我在模型中定义了这些关系:

    领导有许多工作
    Job HABTM员工
    Job HABTM卡车

    find('all') 从我的卡车模型中,并将结果限制为:

    1. 所有卡车,
    2. 分配给那些工作的员工,
    3. 以及与工作相关的线索。

    这是我的查找操作:

    // app/models/truck.php
    $this->find('all', array(
        'contain' => array(
            'Job' => array(
                'Employee',
                'Lead',
                'conditions' => array(
                    'Job.pickup_date' => $date
                )
            )
        )
    ));
    

    出于某种原因,Cake执行两次查询以查找员工。这就导致所有员工每项工作都有两次代表。以下是SQL转储:

    1. SELECT `Truck`.`id`, `Truck`.`truck_number`
      FROM   `trucks` AS `Truck`
      WHERE  1 = 1;
    2. SELECT `Job`.`id`, `Job`.`lead_id`, `Job`.`city`,
             `JobsTruck`.`id`, `JobsTruck`.`job_id`, `JobsTruck`.`truck_id`
      FROM   `jobs` AS `Job`
      JOIN   `jobs_trucks` AS `JobsTruck` ON (`JobsTruck`.`truck_id` IN (2, 3)
      AND    `JobsTruck`.`job_id` = `Job`.`id`)
      WHERE  `Job`.`pickup_date` = '2010-10-06'
    3. SELECT `Lead`.`id`, `Lead`.`name`, `Lead`.`created` FROM `leads` AS `Lead`
      WHERE  `Lead`.`id` = 4
    4. SELECT `Employee`.`id`, `Employee`.`name`, `Employee`.`created`,
             `EmployeesJob`.`id`, `EmployeesJob`.`employee_id`,
             `EmployeesJob`.`job_id`
      FROM   `employees` AS `Employee`
      JOIN   `employees_jobs` AS `EmployeesJob`
             ON (
                 `EmployeesJob`.`job_id` = 1 AND
                 `EmployeesJob`.`employee_id` = `Employee`.`id`
             )
    5. 其中'Lead`.`id`=4
    6. `EmployeesJob`.`id`,`EmployeesJob`.`employee`id`,
      `EmployeesJob`.`工作id`
      从“employees”作为“Employee”`
      以“EmployeesJob”身份加入“EmployeesJob”`
      `EmployeesJob`.`job\u id`=1和
      )

    注意,最后两个查询是重复的。我做错了我错过的事了吗?

    更新
    看来Cake给每辆卡车都发送了一个重复的查询。现在我在trucks表中有15条记录 leads employees 每个重复15次。

    3 回复  |  直到 14 年前
        1
  •  3
  •   riotera    14 年前

    我不知道为什么会有两个查询重复,但这种行为可能会有帮助:

    https://github.com/Terr/linkable

    更新

    这种问题是众所周知的:

        2
  •  1
  •   Ghostpsalm    14 年前

    找不到要加入的 Job/s 特定的 Truck .

    这个 Jobs 是因为 Trucks 职务 15人中的每一人 卡车

    • 把所有的卡车都开走。
    • 给那些日期在的卡车找份工作 .
    • [问题1]附加找到的 乔布斯 卡车 (那是你的15辆卡车),但是连接到 .
    • 再一次 为每个人 卡车

    问题1:问题的根源。您可以在第二个查询中看到(选择 Job …),使用正确的 truck_id 乔布斯 回到右边 卡车 ,因为这是一个不同的查询!所以它把找到的工作 卡车

    问题2:这是“真正的”问题,因为Cake不构造长连接语句,所以无法找到 Employees / Leads 卡车 你想要的。这就是为什么每辆卡车都能找到它们,这是因为 FindAll 卡车

    我希望这有道理。你需要做一个全面的调查 乔布斯 ,因为那是 查询的(取货日期)。

    $this->loadModel('Job');
    $whatev = $this->Job->find('all', array(
        'contain' => array(
            'Job' => array(
                'Truck',
                'Employee',
                'Lead',
                'conditions' => array(
                    'Job.pickup_date' => $date
                )
            )
        )
    ));
    

    CakePHP查询实际上只在找到某个模型的一个/所有时才起作用,如果您有一个double-HABTM关系,最好从中间开始,在两边都起作用。如果您希望按Truck“排序”,那么您可能需要编写自己的查询(模型方法)来自己完成任务。在原始SQL中,这个查询可能很容易,在抽象的PHP超级蛋糕中,这对CakePHP来说是很难允许的。

    就像他们说的,烤得开心!

        3
  •  -3
  •   c0rnh0li0    14 年前

    你想要左连接而不是连接。