【问题标题】:CakePHP is linking models locally, but not on hosted copy?CakePHP 在本地链接模型,但不在托管副本上?
【发布时间】:2018-06-28 18:18:16
【问题描述】:

我的员工只有一个雇主。在我的员工表中,我有一个名为employer_id 的字段。使用此信息的报告适用于我的本地开发设置,但不适用于我的虚拟主机。我不知道是什么原因导致它不这样做。

当我尝试提取所有员工的列表时,我收到以下错误:

错误:SQLSTATE[42S22]:找不到列:1054 未知列 'where 子句'中的'Employer.last_name'

SQL 查询:SELECT Employee.id, Employee.employer_id, Employee.first_name, Employee.last_name, Employee.email, Employee.webinar_id, Employee.questions, Employee.correct_answers, Employee.required_to_pass, Employee.status, Employee.role, Employee.sport, Employee.program, Employee.created, Employee.modified FROM sportrisk_wp.employees AS Employee 在哪里 ((Employee.last_name不喜欢'')和(Employer.last_name不 LIKE '')) AND contain = '1' ORDER BY Employee.created DESC LIMIT 50

在我的本地副本上,当我将 debug 更改为 2 时,我在 SQL 日志中看到以下内容(它正在加入雇主):

选择Employee.id, Employee.employer_id, Employee.first_name, Employee.last_name, Employee.email, Employee.webinar_id, Employee.questions, Employee.correct_answers, Employee.required_to_pass, Employee.status, Employee.role, Employee.sport, Employee.program, Employee.created, Employee.modified, Employer.id, Employer.employer_id, Employer.company, Employer.first_name, Employer.last_name, Employer.phone, Employer.email, Employer.username, Employer.password, Employer.usercode, Employer.subscriber, Employer.active, Employer.admin, Employer.created, Employer.modified, Employer.status FROM local.employees AS Employee 左加入 local.users AS Employer ON (Employee.employer_id = Employer.id) 在哪里 ((Employee.last_name 不喜欢 '') 和 (Employer.last_name 不喜欢'')) 由Employee.created订购 DESC 限制 50

我相信这是所有相关的代码。

用户控制器

// inside a larger function

// Load Employee Model
$this->loadModel('Employee');

// Base conditions - to hide some old records which do not contain name information.
$conditions = array(
        "Employee.last_name NOT LIKE" => '',
        "Employer.last_name NOT LIKE" => ''
    );

// Find records & paginate
$this->paginate = array(
    'limit' => 50,
    'conditions' => array(
        "AND" => $conditions
    ),
    'order' => array('Employee.created DESC')
);

$employees = $this->paginate('Employee');
?>

员工模型

<?php
class Employee extends AppModel
{
    var $name = 'Employee';
    var $recursive = 1;
    var $belongsTo = array (
        'Employer' => array (
            'className' => 'Employer',
            'foreignKey' => 'employer_id',
            'order' => 'Employee.last_name ASC'
        )
    );

    public $actsAs = array('Containable');

    var $validate = array(
        'email' => array(
            'rule' => 'notBlank'
        ),
        'first_name' => array(
            'rule' => 'notBlank'
        ),
        'last_name' => array(
            'rule' => 'notBlank'
        ),
        'usercode' => array(
            'rule' => 'notBlank'
        )
    );
}
?>

雇主模式

<?php
class Employer extends AppModel
{
    var $name = 'Employer';
    var $recursive = -1;
    var $hasOne = 'Supervisor';
    var $hasMany = 'Employee';

    public $useTable = 'users';
    public $actsAs = array('Containable');

    var $validate = array(
        'email' => array(
            'rule' => 'notBlank'
        ),
        'password' => array(
            'rule' => 'notBlank'
        )
    );
}
?>

我不明白为什么它没有在一个环境中链接 Employer 模型,而是在另一个环境中。我已经直接复制了所有文件。

SQL 查询

这是我在托管网站上得到的查询

SELECT `Employee`.`id`, `Employee`.`employer_id`, `Employee`.`first_name`, `Employee`.`last_name`, `Employee`.`email`, `Employee`.`webinar_id`, `Employee`.`questions`, `Employee`.`correct_answers`, `Employee`.`required_to_pass`, `Employee`.`status`, `Employee`.`role`, `Employee`.`sport`, `Employee`.`program`, `Employee`.`created`, `Employee`.`modified` FROM `sportrisk_wp`.`employees` AS `Employee` WHERE ((`Employee`.`last_name` NOT LIKE '') AND (`Employer`.`last_name` NOT LIKE '')) ORDER BY `Employee`.`created` DESC LIMIT 50

这是我在本地网站上获得的(以及我正在寻找的)

SELECT `Employee`.`id`, `Employee`.`employer_id`, `Employee`.`first_name`, `Employee`.`last_name`, `Employee`.`email`, `Employee`.`webinar_id`, `Employee`.`questions`, `Employee`.`correct_answers`, `Employee`.`required_to_pass`, `Employee`.`status`, `Employee`.`role`, `Employee`.`sport`, `Employee`.`program`, `Employee`.`created`, `Employee`.`modified`, `Employer`.`id`, `Employer`.`employer_id`, `Employer`.`company`, `Employer`.`first_name`, `Employer`.`last_name`, `Employer`.`phone`, `Employer`.`email`, `Employer`.`username`, `Employer`.`password`, `Employer`.`usercode`, `Employer`.`subscriber`, `Employer`.`active`, `Employer`.`admin`, `Employer`.`created`, `Employer`.`modified`, `Employer`.`status` FROM `local`.`employees` AS `Employee` LEFT JOIN `local`.`users` AS `Employer` ON (`Employee`.`employer_id` = `Employer`.`id`) WHERE ((`Employee`.`last_name` NOT LIKE '') AND (`Employer`.`last_name` NOT LIKE '')) ORDER BY `Employee`.`created` DESC LIMIT 50

结束结果 最后(在与 Ved 聊天之后)我的分页数组最终变成了这个,并且我的报告加载了。

$this->paginate = array(
            'contain' => array('Employer'),
            'limit' => 50,
            'conditions' => array(
                "AND" => $conditions
            ),
            'joins' => array( array( 'alias' => 'Employer', 'table' => 'users', 'type' => 'LEFT', 'conditions' => 'Employer.id = Employee.employer_id' ) ),
            'fields' => array('Employee.first_name', 'Employee.last_name', 'Employee.email', 'Employee.webinar_id', 'Employee.questions', 'Employee.correct_answers', 'Employee.required_to_pass', 'Employee.status', 'Employee.role', 'Employee.sport', 'Employee.program', 'Employee.created', 'Employer.id', 'Employer.employer_id', 'Employer.company', 'Employer.first_name', 'Employer.last_name', 'Employer.email', 'Employer.active'),
            'order' => array('Employee.created DESC')
        );

【问题讨论】:

  • “我已经直接复制了所有文件。” - 使用 git 或类似的东西来验证两个副本是否在同一个提交 ID 上,并且您没有更改文件。我怀疑这些关联是否会神奇地停止在另一台服务器上工作。
  • 我使用了 diff 工具(Kaleidoscope)来验证文件夹是否相同。

标签: cakephp cakephp-2.0


【解决方案1】:

我认为你忘记加载关联数据,使用包含

// Find records & paginate
$this->paginate = array(
    'contain' => array('Employer'),
    'fields' => array('Employer.id'), // add more fields
    'limit' => 50,
    'conditions' => array(
        "AND" => $conditions
    ),
    'joins' => array( array( 'alias' => 'Employer', 'table' => 'users', 'type' 
    => 'LEFT', 'conditions' => 'Employer.id = Employee.employer_id' ) ),
    'order' => array('Employee.created DESC')
);

【讨论】:

  • 我刚刚尝试添加。没修。谢谢你的建议。
  • 能否提供在分页中添加包含后生成的查询。
  • 我仍然看到与我最初帖子顶部的块引用中相同的查询。我的本地版本中没有左连接。表格都在那里,所有数据都是一样的。
  • 你能把这个 'type' => 'LEFT' 添加到属于数组并尝试
  • 已添加,没有变化。我尝试删除 Employer.last_name 条件,只是想看看会发生什么。之后,纯粹的 Employee 查询就可以工作了,我的报告也出现了,但是所有应该来自每个员工的雇主的字段都有错误(正如人们所期望的那样)。
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2015-09-23
  • 1970-01-01
  • 2019-07-20
  • 2021-04-17
相关资源
最近更新 更多