Атрибут table
Атрибут table в моделях Eloquent позволяет явно задать имя таблицы, с которой модель взаимодействует. По умолчанию Laravel автоматически определяет имя таблицы на основе имени класса модели в нижнем регистре и множественном числе. Например, для модели Article будет использоваться таблица articles, для User - users. Атрибут table переопределяет это поведение и позволяет привязать модель к существующей таблице с нестандартным именем. Это особенно полезно при работе с унаследованными базами данных или при необходимости использовать имя таблицы, которое не соответствует соглашениям Laravel.
Синтаксис
<?php
class ModelName extends Model
{
protected $table = 'table_name';
}
?>
Пример
Создадим модель Article, которая использует таблицу blog_posts вместо стандартной articles:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $table = 'blog_posts';
}
?>
Теперь все запросы к модели Article будут работать с таблицей blog_posts:
<?php
use AppModelsArticle;
$res = Article::where('status', 'published')->get();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3"]
Как видно из примера, модель работает с таблицей blog_posts, хотя имя модели Article предполагает использование таблицы articles.
Пример
Если требуется динамически определять имя таблицы, например, для работы с архивными данными, можно использовать свойства с вычисляемым значением:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected $table;
public function __construct(array $attributes = [], $table = 'articles')
{
$this->table = $table;
parent::__construct($attributes);
}
}
?>
Тогда при создании экземпляра модели можно указать нужную таблицу:
<?php
use AppModelsArticle;
$res = (new Article([], 'articles_archive'))->get();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
["archive article 1", "archive article 2"]
В этом примере мы создали модель с динамическим именем таблицы, что позволяет гибко переключаться между основной таблицей и архивной.
Пример
Атрибут table также полезен для связей с таблицами, имеющими префиксы. Допустим, у нас есть модель Category и таблица product_categories:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Category extends Model
{
protected $table = 'product_categories';
public function articles()
{
return $this->hasMany(Article::class);
}
}
?>
Теперь мы можем получить статьи, принадлежащие определенной категории, несмотря на нестандартное имя таблицы:
<?php
use AppModelsCategory;
$res = Category::with('articles')->get();
foreach ($res as $category) {
echo $category->name . ': ';
echo $category->articles->count();
}
?>
Результат выполнения кода:
["Technology: 5", "Science: 3", "Art: 4"]
Смотрите также
-
атрибут
fillable,
который определяет поля для массового заполнения -
атрибут
guarded,
который определяет поля, защищённые от массового заполнения -
атрибут
primaryKey,
который задаёт имя первичного ключа модели -
атрибут
connection,
который указывает соединение с базой данных для модели