Работал раньше с Doctrine ORM - там всё было очевидно: создаёшь классы сущностей (с наследованием от базового класса, без - нет разницы) - потом автоматически синхронизируешь их с таблицами (каждому не абстрактному классу - своя таблица).
В Eloquent же ничего не понятно: для каждой таблицы создаётся миграция, таблица определяет модель (в модели мы свойства вообще не прописываем). А что если у меня две модели Pages и Articles, которые имеют общие свойства, которые я хочу вынести в базовую абстрактную модель Entry? При этом я хочу иметь две таблицы: Pages и Articles, идентичные поля которых потом не нужно будет править по отдельности. Не нашел в документации, как это реализовать.
Что с миграциями-то делать? Всё же в них задаётся. Создавать абстрактную миграцию с методом, возвращающим общие поля, а метод up() реализовывать в наследниках?
Посторонним В.: Например. Или можно в классе миграции сделать метод, который на заданной таблице добавляет общие поля и вызвать его на двух нужных таблицах.
Посторонним В.: миграции это совсем другое, напрямую с Моделями не связано. Миграции выполняют роль "истории" изменения БД, инструмента отката изменений(если нужно) и быстрого деплоя, опять таки, если нужно. Можно сказать некое подобии системы контроля версий, для БД.
У вас это должен быть параллельный инструмент, просто в Ларавел для удобства можно создавать миграции сразу же с моделями, но это не обязательно, вы можете вести этот процесс независимо(можно вообще не делать, хотя я бы рекомендовал)
Александр Талалаев: т.е. в Laravel нет инструментария для удобной генерации таблиц БД для моделей с наследованием? И таблицы в этом паттерне в принципе не генерируются на основе моделей (наоборот - модели привязаны к имеющимся таблицам, как я вижу).
Посторонним В.: нет, в Laravel БД не формируется исходя из моделей. БД формируется миграциями. Да, при создании модели есть опция сделать миграцию, но это чисто для того, чтобы потом руками не создавать этот файл отдельно. Там ещё и контроллер для круда можно сделать автоматом, но это же не значит, что к каждой модели обязателен контроллер.
Миграции - это отдельная от всего вещь, это просто способ записи изменения БД в гите.
И вам точно надо делать иерархию моделей ? Зачем, если рабочая модель в Laravel с полным функционалом это class Article extends Illuminate\Database\Eloquent\Model {} ? В laravel всё проще.
abstract class EntryBase extends Migration
{
public function up(): void
{
Schema::create($this->getTableName(), function (Blueprint $table) {
$table->increments('id');
// добавляем другие поля
$this->setColumns($table);
});
}
abstract protected function setColumns(Blueprint $table);
abstract protected function getTableName(): string;
public function down()
{
Schema::dropIfExists($this->getTableName());
}
}
В реализациях методов добавляются дополнительные колумны и задаётся имя таблицы.