Использование заклинаний Laravel и мутаторов одновременно

Использование заклинаний Laravel и мутаторов одновременно

13.11.2016 12:39:00 Просмотров 40 Источник

Это часть моей ролевой модели:

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)

Если я печатаю переменную $permissionsпосле ksort

Если я удалю функцию setPermissionsAttribute, она правильно сериализует массив в json и сохраняет его в базе данных.

Я делаю что-то не так или просто невозможно использовать обе эти функции?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/40567925/using-laravel-casts-and-mutators-at-the-same-time#comment68372802_40567925
вы пробовали в setPermissionsAttribute просто вернуть значение?
https://stackoverflow.com/questions/40567925/using-laravel-casts-and-mutators-at-the-same-time#comment68382999_40567925
@AmirBar Да, это просто ничего не даст.

Ответы - Использование заклинаний Laravel и мутаторов одновременно / Using Laravel casts and mutators at the same time

Mutai Mwiti

25.06.2018 09:46:21

$cast-это тоже своего рода сам мутатор. Нет никакого смысла иметь и то, и другое в любом случае. Необходимо определить другое поле, основанное на атрибуте разрешений.

https://stackoverflow.com/questions/40567925/using-laravel-casts-and-mutators-at-the-same-time/51017673#comment96785312_51017673
Представьте, что вам нужно иметь приведение типа массива, но вы хотите установить значение по умолчанию, если массив пуст.
Mihai Crăiță

06.04.2019 09:06:49

Когда атрибут берется из модели, функция mutateAttribute вызывается перед атрибутом castAttribute. Вы можете увидеть код здесь

Но вы можете вызвать функцию castAttribute в мутаторе

 public function getPermissionsAttribute($value) {
    $p = $this->castAttribute('permissions', $value);
    ksort($p);
    return $p;
}
Marek Gralikowski

12.01.2020 03: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.

Закрыть X