这是我的角色模型的一部分:
namespace App;
use App\Traits\Permissions;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
use Permissions;
/**
* {@inheritDoc}
*/
protected $casts = [
'permissions' => 'array',
];
}这是我的权限特征:
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)如果我在ksort操作之后打印$permissions变量,它将正确地具有权限数组:
array:1 [
"do.this" => true
]如果我删除setPermissionsAttribute函数,它会正确地将数组序列化为json并将其存储在数据库中。
是我做错了什么,还是不可能同时使用这两个功能?
发布于 2019-04-07 02:06:49
当从模型获取属性时,在castAttribute之前调用mutateAttribute函数。您可以查看here背后的代码
但是您可以在赋值器中调用castAttribute函数
public function getPermissionsAttribute($value) {
$p = $this->castAttribute('permissions', $value);
ksort($p);
return $p;
}发布于 2018-06-25 14:46:22
$cast本身也是一种突变器。两者兼而有之是没有任何意义的。您应该定义另一个基于permissions属性的字段。
发布于 2020-01-12 20:50:56
public function setPermissionsAttribute($value): void
{
$value['default']['value'] = true; // add, fill, remove, cast, sort etc..
if ($value !== null && $this->isJsonCastable('permissions')) {
$value = $this->castAttributeAsJson('permissions', $value);
}
$this->attributes['permissions'] = $value;
}这个提议对Laravel的代码库更加严格。
https://stackoverflow.com/questions/40567925
复制相似问题