Может ли модель иметь несколько таблиц в CakePHP? - PullRequest
6 голосов
/ 03 апреля 2009

Может ли модель иметь несколько таблиц в CakePHP?

Ответы [ 5 ]

5 голосов
/ 03 апреля 2009

Угадывая из этого предложения в руководстве:

Модель, как правило, является точкой доступа к базе данных, а точнее, к определенной таблице в базе данных. По умолчанию каждая модель использует таблицу, имя которой во множественном числе является ее собственным, то есть модель «Пользователь» использует таблицу «пользователи».

Я так не думаю, но вы можете установить отношения, может быть, это то, что вам нужно.

Проверьте это

4 голосов
/ 20 марта 2012

Конечно, это удобно, когда у вас много одинаковых таблиц.

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');
    }
}
2 голосов
/ 10 апреля 2009

Технически, исходя из того, как вы задаете вопрос, а не из того, что я знаю. Однако часто я использую отношения с чем-то, что может быть похожим на то, что вы ищете. Например, у человека есть адресная информация, которую можно легко удалить из таблицы людей, но я обычно предпочитаю извлекать ее, потому что другие объекты также могут иметь адреса (бизнес и т. Д.).

Та же идея, если вы хотите реализовать какую-либо модель псевдонаследования в вашей БД. Например, волонтеры - это люди, а также подрядчики, продавцы и сотрудники. Все они имеют определенные свойства, которые вы, возможно, захотите сохранить в таблице людей, и другие, которые уникальны для того типа людей, которым они являются.

В каждом случае у вас есть две модели, но они без проблем работают вместе через свои ассоциации.

Если вы думаете о таком сценарии, то подобный подход может сработать для вас, хотя он не относится к модели с несколькими таблицами.

1 голос
/ 21 июня 2009

Полагаю, вы хотите реализовать какое-либо наследование в базе данных (для этого требуется объединить данные, хранящиеся в родительской таблице, при извлечении информации из дочерней таблицы). Мой подход к решению этой проблемы заключался в использовании обратного вызова 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;
}

Таким образом, я включал поля / поля из родительской таблицы в результаты, полученные из дочерней таблицы. В этом случае я предположил, что обе таблицы являются индексами с полем с именем id, и это поле в дочерней таблице также является внешним ключом для родительской таблицы (таким образом, создается псевдоследование).

1 голос
/ 06 апреля 2009

Он не может иметь несколько таблиц одновременно ..., но вы можете изменить свойство Model :: useTable, чтобы переключить таблицу модели на другую. Повернись и дай нам знать, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...