Это часть моей ролевой модели:
namespace App;
use App\Traits\Permissions;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
use Permissions;
/**
* {@inheritDoc}
*/
protected $casts = [
'permissions' => 'array',
];
}
Это моя черта Permissions:
namespace App\Traits;
trait Permissions
{
public function setPermissionsAttribute($permissions)
{
ksort($permissions);
$this->attributes['permissions'] = $permissions;
}
/**
* Adds a permission.
*
* @param string $permission
* @param bool $value
* @return void
*/
public function addPermission($permission, $value = true)
{
if (!array_key_exists($permission, $this->getAttribute('permissions'))) {
$this->setAttribute('permissions', array_merge($this->getAttribute('permissions'), [$permission => $value]));
}
}
}
Это вызовет следующее исключение:
QueryException in Connection.php line 769:
Array to string conversion (SQL: update `roles` set `permissions` = 1 where `id` = 46526e77-98b8-4126-aaae-7e109c7ea227)
Если я распечатаю $permissions
переменная после ksort
Операция это правильно имеет массив полномочий:
array:1 [
"do.this" => true
]
Если я удалю setPermissionsAttribute
Функция это правильно сериализует массив в JSON и сохраняет его в базе данных.
Я делаю что-то не так или просто невозможно использовать обе эти функции?
$cast
это тоже своего рода мутатор. Нет смысла иметь оба способа. Вы должны определить другое поле, основанное на permissions
приписывать.
Других решений пока нет …