Реализация наследования одной таблицы с помощью Laravel Eloquent
При работе с моделями баз данных наследование позволяет определять иерархии связанных сущностей. Однако при выборе между наследованием одной таблицы и несколькими таблицами последнее часто оказывается более эффективным и гибким решением.
Наследование одной таблицы
Хотя концептуально проще, одна таблица Наследование требует хранения всех столбцов всех типов в одной таблице, что приводит к потенциальному увеличению числа значений NULL. Это может повлиять на производительность базы данных, особенно с большими наборами данных.
Наследование нескольких таблиц с помощью Eloquent
Наследование нескольких таблиц предполагает разделение одной таблицы на несколько таблиц, каждая из которых соответствует конкретный тип модели. Фреймворк Laravel Eloquent предлагает полиморфные отношения для беспрепятственного управления этими отношениями.
Модель сообщения
Базовый класс для всех типов сообщений, Post, представляет общие столбцы и определяет публикуемый объект. полиморфные отношения:
class Post extends Eloquent {
public function postable() {
return $this->morphTo();
}
}
Модели вопросов/статей
Каждый конкретный тип сообщения, например вопрос или статья, является продолжением сообщения и определяет связь morphOne с базовой моделью:
class Question extends Post {
public function post() {
return $this->morphOne('Post', 'postable');
}
}
Примеры использования
Создание нового вопроса
Для создания нового вопроса необходимо связать его с таблицей сообщений для поддержки многотабличного наследования:
$post = new Post();
$post->shared_column = 'New Question Post';
$post->save();
$question = new Question();
$question->question_column = 'My Question';
$question->save();
$question->post()->save($post);
Хотя многотабличное наследование требует большей сложности, оно обеспечивает более чистую структуру базы данных, повышает производительность и обеспечивает большую гибкость при моделировании сложных отношений.
Подробные руководства по многотабличному наследованию в Laravel см. в ресурсах, представленных в исходном ответе на вопрос.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3