Я использую Laravel 6 с бэкэндом базы данных SQL Server 2017.В базе данных у меня есть таблица PersonPhoto с колонкой Photo и колонкой Thumbnail, где фотографии и миниатюры хранятся как VARBINARY.
Я определил следующую модель Eloquent с двумя аксессорами для преобразования изображений вкодировка base64:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class PersonPhoto extends Model
{
protected $connection = 'mydb';
protected $table = 'PersonPhoto';
protected $primaryKey ='PersonID';
public function person(){
return $this->belongsTo('App\Person', 'PersonID');
}
public function getPhotoAttribute($value){
return base64_encode($value);
}
public function getThumbnailAttribute($value){
return base64_encode($value);
}
}
Это прекрасно работает в шаблонах Blade, однако, когда я пытаюсь сериализовать в JSON или массив, я получаю ошибку «Malformed UTF-8, возможно, неправильно закодированная», как если бы Accessorsигнорируются, а необработанные данные сериализуются.Чтобы обойти это, я изменил модель:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class PersonPhoto extends Model
{
protected $connection = 'mydb';
protected $table = 'PersonPhoto';
protected $primaryKey ='PersonID';
//Added to hide from and add fields to serializer
protected $hidden = ['Photo', 'Thumbnail'];
protected $appends = ['encoded_photo', 'encoded_thumbnail'];
public function person(){
return $this->belongsTo('App\Person', 'PersonID');
}
public function getPhotoAttribute($value){
return base64_encode($value);
}
public function getThumbnailAttribute($value){
return base64_encode($value);
}
//Added these new accessors
public function getEncodedPhotoAttribute(){
return base64_encode($this->Photo);
}
public function getEncodedThumbnailAttribute(){
return base64_encode($this->Thumbnail);
}
}
Это скрывает исходные поля Photo и Thumbnail от сериализатора и включает в себя два новых метода доступа.Похоже, это работает и решает мою проблему.
Вопросы: 1) Сериализатор Laravel игнорирует мои аксессоры, как я подозреваю, и это задумано?2) Хотя мой обходной путь работает, это разумный подход или я могу столкнуться с проблемами?Есть ли лучший способ сделать это?
Спасибо