CakePHP связывает модели локально, но не на размещенной копии? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть сотрудники, у которых есть один работодатель. В моей таблице сотрудников у меня есть поле Employer_id. Отчет, использующий эту информацию, работает на моей локальной установке разработки, но не на моем веб-хостинге. Я не могу понять, что может быть причиной этого.

Когда я пытаюсь получить список всех сотрудников, я получаю следующую ошибку:

Ошибка: SQLSTATE [42S22]: столбец не найден: 1054 столбец неизвестен 'Employer.last_name' в 'предложении where'

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 ОТ sportrisk_wp. employees КАК Employee ГДЕ ((Employee. last_name НЕ НРАВИТСЯ '') И (Employer. last_name НЕ LIKE '')) AND contain = '1' ORDER BY Employee. created DESC LIMIT 50

На моей локальной копии, когда я изменяю debug на 2, я вижу следующее в журнале 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, 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 ОТ local. employees КАК Employee ВПРАВО local. users AS Employer ON (Employee. employer_id = Employer. id) ГДЕ ((Employee. last_name НЕ НРАВИТСЯ '') И (Employer. last_name НЕ НРАВИТСЯ '')) ЗАКАЗАТЬ ПО Employee. created DESC LIMIT 50

Я полагаю, что это весь соответствующий код.

UsersController

// 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'
        )
    );
}
?>

Не могу понять, почему она не связывает модель Работодателя в одной среде, а в другой. Я сделал прямую копию всех файлов.

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

1 Ответ

0 голосов
/ 29 июня 2018

Я думаю, что вы забыли загрузить связанные данные, используйте

// 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')
);
...