Имя вычислительной таблицы по названию модели - PullRequest
3 голосов
/ 25 июля 2011

В моем приложении CakePHP у меня есть такая модель:

class Duck extends AppModel {
    var $name = 'Duck';

    function get_table_name() {
        $tbl_name = //compute default table name for this model         
    }
}

Я хотел бы написать функцию get_table_name(), которая выводит имя таблицы по умолчанию для модели.Для приведенного выше примера он должен вывести ducks.

РЕДАКТИРОВАТЬ: Несколько человек указали на использование $this->table.Я провел небольшое тестирование и обнаружил следующее:

  1. В вопросе, который я поставил выше, $this->table действительно содержит имя таблицы.
  2. Однако на самом деле,мой код выглядел примерно так:

    class Duck extends Bird {
        var $name = 'Duck';
        function get_table_name(){
            $tbl_name = //comput default table name for this model
        }
    }
    class Bird extends AppModel {
    
    }
    

    В этом случае $ this-> table - пустая строка.Я пошел с этим подходом, потому что я хотел разделить некоторый код между двумя моими моделями.Похоже, что это не очень хороший способ делиться кодом между моделями, которым требуется некоторая общая функциональность.

Ответы [ 5 ]

3 голосов
/ 25 июля 2011

Вы ищете класс Inflector.

Inflector::tableize($this->name) 

(tableize вызывает два метода Inflector для генерации имени таблицы: подчеркивание() и множественное число () )

Редактировать:

Согласно исходный код , $this->table должен содержать имя таблицы, которую CakePHP будет использовать для модели, но, по моему опыту, это не всегда установлено.Я не уверен почему.

2 голосов
/ 25 июля 2011

Чтобы получить имя таблицы, которую использует модель в данный момент, вы можете использовать: $this->table.Если вы не меняете условные обозначения таблиц модели вручную, это может оказаться наиболее полезным в случае, когда CakePHP когда-либо изменяет свои условные обозначения, чтобы использовать имена таблиц, используя что-то отличное от Inflector.

1 голос
/ 12 марта 2015

Чтобы получить полное имя таблицы для модели, вы должны принять во внимание префикс таблицы.

$table = empty($this->table) ? Inflector::tableize($this->name) : $this->table;
$fullTableName = $this->tablePrefix . $table;
1 голос
/ 25 июля 2011

CakePHP Inflector

function get_table_name() {

    $tbl_name = Inflector::pluralize($this->name);

}

ИЛИ tableize метод

function get_table_name() {

    $tbl_name = Inflector::tableize($this->name);

}

Редактировать

Это также решает проблему "призрака" с $this->table в модели.

Копание в __construct для Model Я обнаружил две вещи:

  1. Cake использует Inflector::tableize(), чтобы получить имя таблицы. Одного этого достаточно, чтобы оправдать использование tableize вместо pluralize.Вы получите согласованные результаты.

  2. $this->table не устанавливается Model::__construct(), если только $this->useTable === false AND $this->table === false.

Похоже, что если вы знаете, что вы не установили $this->useTable на false, вы сможете использовать это значение выше $this->table.Правда, хотя я только кратко отсканировал источник, и я не выкопал достаточно глубоко, чтобы сказать, почему $this->table иногда не работает.

0 голосов
/ 07 февраля 2015

Раньше я использовал инфлектор, чтобы получить имя таблицы из названия модели

$tableName = Inflector::pluralize(Inflector::underscore($model));

но это не совсем универсально, использование useTable выглядит лучше, по умолчанию оно будет содержать имя таблицы по соглашению, и если у вас есть таблица, которая не соответствует соглашениям, то вы должны вручную указать ее как useTable , Итак, в обоих случаях результат будет правильным

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