#php #laravel #laravel-5 #eloquent #laravel-5.3
#php #laravel #laravel-5 #красноречивый #laravel-5.3
Вопрос:
Ниже приведен код для модели
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
protected $appends = [
"desc"
];
protected $fillable = ['id'];
public function getDescAttribute()
{
return strip_tags( $this->attributes['description'] );
}
}
Итак, теперь, когда я делаю
$product = Product::first();
Он не возвращает поле desc в $product, хотя, когда я делаю $product-> desc, он возвращает результат, но я хочу, чтобы этот результат был добавлен в саму модель.
Следующий код выдает ошибку
$product = Product::first()->get(['desc']);
Он запускается
Select desc from products...
Но поскольку desc отсутствует, я получаю сообщение об ошибке.
Я что-то делаю не так?
Комментарии:
1. Что происходит при добавлении
protected $visible = ['desc'];
?2. затем
$product = Product::first();
отображаетсяAppProduct {#729}
с не столбцами в tinker
Ответ №1:
Поля, которые вы добавляете в массив $appends, добавляются только тогда, когда объект сериализуется в array / JSON. В противном случае не имеет смысла определять этот атрибут, пока он действительно не понадобится — вот почему вы получаете значение при доступе к $product-> desc . Это сделано для экономии ненужных операций — вычисление значения пользовательского атрибута может потребовать некоторых тяжелых операций и откладывается до тех пор, пока это действительно не понадобится.
Комментарии:
1. Я думаю, что $appends работает с Laravel 5.3 или что произойдет, если я возвращаю ответ JSON на отдельный интерфейс?