Получить модель по имени таблицы в yii2

У меня есть один метод в нескольких моделях, реализованных по-разному. Я знаю только имя таблицы в базе данных. Я должен найти модель этого стола. Как сделать?

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();

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

Ahmed Sunny 29.01.2019 16:17

Привет! Да, я это знаю, но я все еще искал другой вариант.

Mary 29.01.2019 16:54

хорошо, но объясните сценарий подробнее, почему и как вы хотите его использовать.

Ahmed Sunny 29.01.2019 17:09

Я отредактировал вопрос.

Mary 29.01.2019 17:23

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

Ahmed Sunny 29.01.2019 17:44

Почему бы не создать массив, который сопоставляет классы ARE со связанными таблицами?

rob006 29.01.2019 18:25

@ rob006, потому что его будет сложно поддерживать, постоянно добавляйте новые таблицы.

Mary 30.01.2019 10:08

@AhmedSunny Я создам функцию, в которую буду передавать имя таблицы и из нее генерировать имя модели. Я буду обрабатывать первую букву заглавной и символ _ в имени таблицы... 'tirst' (таблица) - First (модель), 'second_table' - SecondTable (модель) и т.д...

Mary 30.01.2019 10:09

да, что бы я сделал

Ahmed Sunny 30.01.2019 10:12

ucfirst() использовать это. если вам нужна помощь с функцией, вы можете добавить подробности в вопрос об именах таблиц

Ahmed Sunny 30.01.2019 10:15

Tnx, я думаю, что я могу это сделать

Mary 30.01.2019 10:23

@AhmedSunny Если хотите, вы можете оставить свой комментарий, чтобы ответить, чтобы я мог его принять. Спасибо за советы!

Mary 30.01.2019 10:25

@Mary Это должно быть более гибким и менее волшебным, чем создание полного доменного имени модели на основе имени таблицы (вам нужно следовать строгим соглашениям, если вы хотите это поддерживать, что не всегда так просто). Добавление новой записи в карту моделей не должно иметь большого значения, если сравнивать это с созданием класса модели (и, возможно, CRUD), и может быть частично автоматизировано.

rob006 30.01.2019 10:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
851
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это таким образом, когда получите имя таблицы

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, а также он получает имя таблицы, и вы можете настроить это в соответствии с вашими потребностями, вы можете добавить дополнительный шаг, удалить префикс из имени таблицы и сделать все остальное

Ahmed Sunny 30.01.2019 15:27

У моделей нет префиксов, но у имен таблиц есть. Вот как Gii генерирует имя модели, и оно все еще не идеально: github.com/yiisoft/yii2-gii/blob/…

rob006 30.01.2019 15:44

Я знаю, для этого вопроса это нормально, но не для всех. поскольку я использую разные схемы и не могу использовать crud, yii не может с этим справиться.

Ahmed Sunny 30.01.2019 15:50

Другие вопросы по теме