Выбор имен полей при поиске результатов из двух таблиц

У меня есть две таблицы (которые находятся в двух разных базах данных). «клиенты» и «домены», клиенты могут иметь несколько доменов.

Это код, который я использую:

$this->Domain->find('all', array(
    'order' => 'domain ASC',
    'fields' => array(
        'Domain.id',
        'Domain.domain',
        'Server.name',
        'Client.id',
        'Client.name'
    )
));

Когда я возвращаю все поля, не используя 'fields' => array(), все работает нормально, как только я запрашиваю определенные поля, он говорит:

Ошибка SQL: 1054: неизвестный столбец «Client.id» в «списке полей»

Все также работает нормально, если я просто удалю два столбца клиента (модель клиента — единственная модель, которая находится в другой базе данных.


person 472084    schedule 08.12.2010    source источник


Ответы (2)


Если клиенты hasMany домены, поэтому ваши модели должны называться как $this->Domain->find('all');, явно передавая поля Client.id, будет отображаться ошибка, так как это не часть таблицы доменов, включите дамп sql с помощью debug=2 и посмотрите, как выполняются запросы.

Вы модели должны быть

// in client.php model - having structure - id, name
$hasMany = 'Domain';

// in domain.php model - having structure - id, name, client_id
$belongsTo = 'Client';

Это должно работать так

$this->Domain->recursive = 1;
$data = $this->Domain->find('all');
// $data = Array ( 'Domain' => ********, 'Client' => ****** )
person Ish    schedule 08.12.2010
comment
Он заявляет, что две его таблицы (домены и клиенты) находятся в разных базах данных - я думаю, что его проблема заключается в попытке охватить разные базы данных. - person Travis Leleu; 08.12.2010
comment
Но это позволяет мне использовать столбец Server.name, который является частью другой таблицы? - person 472084; 08.12.2010

Если ваши две таблицы находятся в разных базах данных, вы действительно усложняете себе жизнь. Насколько мне известно, Cake не поддерживает объединение двух таблиц (или установление отношений) между двумя разными базами данных. Почему у вас есть клиентская таблица в отдельной БД?

Если вы не можете переместить свою таблицу, я думаю, вам придется написать некоторый собственный код внутри вашей модели домена, чтобы он использовал (по умолчанию) строку подключения к базе данных для доменов, но создавал и подключал другой ресурс базы данных. в другую базу данных. См. http://bakery.cakephp.org/articles/doze/2010/03/12/use-multiple-databases-in-one-app-based-on-requested-url, как это сделать. -- перейдите к разделу "Динамический выбор правильной базы данных".

ХТХ, Трэвис

person Travis Leleu    schedule 08.12.2010
comment
У меня есть они в другой базе данных, потому что я заимствую их с другого веб-сайта и не хочу дублирования. Мне удалось заставить несколько баз данных работать нормально, используя: var $useDbConfig = 'anotherdb'; - person 472084; 08.12.2010
comment
Верно, но я не думаю, что вы можете изменить переменную dbConfig в середине запроса, не так ли? Похоже, вам все равно нужно создать собственный метод поиска. - person Travis Leleu; 08.12.2010
comment
Альтернативной идеей было бы создать триггер для другой таблицы базы данных. При создании/обновлении/удалении запустите его, чтобы отразить данные в другой базе данных. - person Travis Leleu; 08.12.2010
comment
У меня нет проблем с несколькими базами данных, изменение $useDbConfig в модели работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, что я могу выбрать, какие столбцы я возвращаю, просто чтобы ускорить процесс. когда я запрашиваю столбцы из таблицы клиентов, он говорит, что они не существуют. - person 472084; 09.12.2010
comment
Правильно, это потому, что метод find() обычно не извлекает из отдельных баз данных, что вы пытаетесь сделать с вашим запросом. Вам нужно переопределить ваш Model::find(), чтобы он это сделал. Я бы все же предложил собрать все вместе в одной базе данных; если нет чрезвычайно веских причин, это сделает вашу жизнь намного проще. Почему бы просто не добавить свои таблицы Cake-app в базу данных другого сайта? Вы всегда можете удалить их позже по мере необходимости. - person Travis Leleu; 09.12.2010