У меня есть один метод в нескольких моделях, реализованных по-разному. Я знаю только имя таблицы в базе данных. Я должен найти модель этого стола. Как сделать?
interface BaseIndexedModel
{
public function writeSometext();
}
и некоторые модели реализуют это. Пример
class First extends \yii\db\ActiveRecord implements BaseIndexedModel
{
public function writeSometext(){
return "1";
}
}
class Second extends \yii\db\ActiveRecord implements BaseIndexedModel
{
public function writeSometext(){
return "2";
}
}
Далее по определенному событию мне нужно вызвать нужную модель и этот метод. Но когда я позвоню, я буду знать только таблицу базы данных, но не модель.
Если таблица "первая", First::writeSometext();
Если таблица "вторая", Second:: writeSometext();
Привет! Да, я это знаю, но я все еще искал другой вариант.
хорошо, но объясните сценарий подробнее, почему и как вы хотите его использовать.
Я отредактировал вопрос.
я думаю, что либо у вас есть где-то список моделей, либо метод, который я вам сказал, потому что вы знаете только имя таблицы из БД, поэтому лучше всего будет то же имя, что и у таблицы и модели. что более динамично
Почему бы не создать массив, который сопоставляет классы ARE со связанными таблицами?
@ rob006, потому что его будет сложно поддерживать, постоянно добавляйте новые таблицы.
@AhmedSunny Я создам функцию, в которую буду передавать имя таблицы и из нее генерировать имя модели. Я буду обрабатывать первую букву заглавной и символ _ в имени таблицы... 'tirst' (таблица) - First (модель), 'second_table' - SecondTable (модель) и т.д...
да, что бы я сделал
ucfirst() использовать это. если вам нужна помощь с функцией, вы можете добавить подробности в вопрос об именах таблиц
Tnx, я думаю, что я могу это сделать
@AhmedSunny Если хотите, вы можете оставить свой комментарий, чтобы ответить, чтобы я мог его принять. Спасибо за советы!
@Mary Это должно быть более гибким и менее волшебным, чем создание полного доменного имени модели на основе имени таблицы (вам нужно следовать строгим соглашениям, если вы хотите это поддерживать, что не всегда так просто). Добавление новой записи в карту моделей не должно иметь большого значения, если сравнивать это с созданием класса модели (и, возможно, CRUD), и может быть частично автоматизировано.





Вы можете сделать это таким образом, когда получите имя таблицы
public function getModelName($table_name) {
$table_name = 'first_table';
// $table_name = 'first';// if name is single word then comment the next line
$table_split = explode("_",$table_name);
$model = ucfirst($table_split[0]).ucfirst($table_split[1]);
return $model;
}
вы можете вызвать эту функцию и проверьте, существует ли он
$model = getModelName($table_name);
var_dump($model);
да, но имя модели без префикса в Yii, а также он получает имя таблицы, и вы можете настроить это в соответствии с вашими потребностями, вы можете добавить дополнительный шаг, удалить префикс из имени таблицы и сделать все остальное
У моделей нет префиксов, но у имен таблиц есть. Вот как Gii генерирует имя модели, и оно все еще не идеально: github.com/yiisoft/yii2-gii/blob/…
Я знаю, для этого вопроса это нормально, но не для всех. поскольку я использую разные схемы и не могу использовать crud, yii не может с этим справиться.
если вы правильно сделали модель, то имя всегда является первой буквой заглавной буквы имени таблицы