Атрибут appends
Атрибут appends в моделях Eloquent позволяет указать список вычисляемых полей, которые должны автоматически добавляться к результатам запроса в виде дополнительных свойств. Это удобно, когда нужно включить в выборку данные, полученные через аксессоры или вычисляемые значения, без ручного добавления в каждом запросе. Атрибут представляет собой защищённый массив, содержащий имена полей, которые будут добавлены к экземплярам модели при их получении из базы данных.
Синтаксис
<?php
use Illuminate\Database\Eloquent\Model;
class ModelName extends Model
{
protected $appends = ['field1', 'field2', 'field3'];
}
?>
Пример
Давайте добавим в модель Article вычисляемое поле 'full_title', которое будет формироваться из полей 'title' и 'subtitle':
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $appends = ['full_title'];
public function getFullTitleAttribute()
{
return $this->title . ' - ' . $this->subtitle;
}
}
?>
Теперь при получении записей в контроллере поле 'full_title' будет доступно автоматически:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
foreach ($articles as $article) {
echo $article->full_title;
}
}
}
?>
Результат выполнения кода для статей с заголовками:
"First Article - Subtitle one"
"Second Article - Subtitle two"
"Third Article - Subtitle three"
Пример
Давайте добавим вычисляемое поле 'is_new', которое будет определять, создана ли статья в течение последних 7 дней:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Article extends Model
{
protected $appends = ['is_new'];
public function getIsNewAttribute()
{
return $this->created_at->diffInDays(Carbon::now()) <= 7;
}
}
?>
Теперь при выборке статей поле 'is_new' будет автоматически добавлено к каждой модели:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::take(3)->get();
foreach ($articles as $article) {
echo $article->title . ': ' . ($article->is_new ? 'New' : 'Old');
}
}
}
?>
Результат выполнения кода:
"First Article: New"
"Second Article: Old"
"Third Article: Old"
Пример
Давайте рассмотрим возможность добавления нескольких вычисляемых полей одновременно. Добавим в модель User поля 'full_name' и 'short_info':
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $appends = ['full_name', 'short_info'];
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
public function getShortInfoAttribute()
{
return $this->email . ' - ' . $this->full_name;
}
}
?>
Теперь оба вычисляемых поля будут доступны при выборке пользователей:
<?php
namespace App\Http\Controllers;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
$users = User::take(2)->get();
foreach ($users as $user) {
echo $user->full_name . ' - ' . $user->short_info;
}
}
}
?>
Результат выполнения кода:
"John Doe - john@example.com - John Doe"
"Jane Smith - jane@example.com - Jane Smith"