首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用Laravel强制转换和mutators

同时使用Laravel强制转换和mutators
EN

Stack Overflow用户
提问于 2016-11-13 05:39:01
回答 3查看 2.5K关注 0票数 3

这是我的角色模型的一部分:

代码语言:javascript
复制
namespace App;

use App\Traits\Permissions;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    use Permissions;

    /**
     * {@inheritDoc}
     */
    protected $casts = [
        'permissions' => 'array',
    ];
}

这是我的权限特征:

代码语言:javascript
复制
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]));
        }
    }
}

这将抛出以下异常:

代码语言:javascript
复制
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变量,它将正确地具有权限数组:

代码语言:javascript
复制
array:1 [
  "do.this" => true
]

如果我删除setPermissionsAttribute函数,它会正确地将数组序列化为json并将其存储在数据库中。

是我做错了什么,还是不可能同时使用这两个功能?

EN

回答 3

Stack Overflow用户

发布于 2019-04-07 02:06:49

当从模型获取属性时,在castAttribute之前调用mutateAttribute函数。您可以查看here背后的代码

但是您可以在赋值器中调用castAttribute函数

代码语言:javascript
复制
 public function getPermissionsAttribute($value) {
    $p = $this->castAttribute('permissions', $value);
    ksort($p);
    return $p;
}
票数 7
EN

Stack Overflow用户

发布于 2018-06-25 14:46:22

$cast本身也是一种突变器。两者兼而有之是没有任何意义的。您应该定义另一个基于permissions属性的字段。

票数 1
EN

Stack Overflow用户

发布于 2020-01-12 20:50:56

代码语言:javascript
复制
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的代码库更加严格。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40567925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档