Может ли модель иметь несколько таблиц в CakePHP?
Угадывая это предложение в руководстве:
Модель, как правило, является точкой доступа к базе данных и, более конкретно, к определенной таблице в базе данных. По умолчанию каждая модель использует таблицу, имя которой является ее множественным числом, то есть модель «Пользователь» использует таблицу «пользователей».
Я так не думаю, но вы можете наладить отношения, возможно, то, что вам нужно.
Проверь это
Конечно, это возможно, это удобно, когда у вас много одинаковых таблиц.
class SomeModel extends Model { var $useTable = false; public function ReadData() { // select table if($a == 1) $this->setSource('tableName1'); else if($a == 2) $this->setSource('tableName2'); // ... else if($a == N) $this->setSource('tableNameN'); // now perform operations with selected table return $this->find('all'); } }
Технически, основываясь на том, как вы задаете вопрос, не то, что я знаю. Часто, однако, я буду использовать отношения к чему-то, что может быть похоже на то, что вам нужно. Например, у человека есть адресная информация, которая может быть легко удалена в таблице людей, но я обычно предпочитаю ее вытаскивать, потому что другие объекты могут также иметь адреса (бизнес и т. Д.).
Такая же идея, если вы хотите реализовать какую-то модель псевдо-наследования в своей БД. Например, добровольцы – это люди, но это также подрядчики, продавцы и сотрудники. Все они разделяют определенные свойства, которые вы можете захотеть сохранить в таблице людей, и другие, которые являются уникальными для того типа, которым они являются.
В каждом случае у вас есть две модели, но они легко работают вместе через свои ассоциации.
Если это тот сценарий, о котором вы думаете, тогда подобный подход может сработать для вас, хотя речь идет не о модели с несколькими таблицами.
Он не может одновременно иметь несколько таблиц …, но вы можете изменить свойство Model :: useTable, чтобы переключить таблицу модели на другую. Дайте ему вихрь и сообщите нам, если это сработает.
Я предполагаю, что вы хотите реализовать какое-то наследование в базе данных (что требует объединения данных, хранящихся в родительской таблице при получении информации из дочерней таблицы). Мой подход к решению этого вопроса заключался в использовании обратного вызова afterFind в дочерней модели. Я переопределил обратный вызов следующим образом:
function afterFind($results) { foreach ($results as $key => $val) { $fieldRetrieved=$this->query("SELECT *field* FROM *parent_table* WHERE id={$val['*ChildModelName*']['id']}"); $results[$key]['*ChildModelName*']['*field*']=$fieldRetrieved[0]['*parent_table*']['*field*']; } return $results; }
Таким образом, я включал поле / s из родительской таблицы в результаты, полученные из дочерней таблицы. В этом случае я предположил, что обе таблицы – это индекс с полем с именем id, и это поле в дочерней таблице также является внешним ключом к родительской таблице (таким образом, создавая псевдонаследование).