2

我有一个名为 Vote_actions 的数据库和模型,如下所示:

  • ID
  • group_id
  • 用户身份
  • 动作类型
  • 匿名(布尔值)

用户可以要求匿名(这将使布尔值变为真)。如果是这种情况,我想将返回模型中的 group_id 和 user_id 更改为 -1。

在 laravel 中有没有办法可以做到这一点?

4

3 回答 3

2

我知道这个问题很老了。我一直在寻找一种在某些条件下隐藏某些字段的方法,例如Auth Roles等外部条件和Model attributes等内部条件,我找到了一种非常灵活的方式来隐藏它们。

而且由于我看到其他 OP 的重复帖子Laravel Hidden Fields On Condition要求隐藏字段,所以我将与您分享。

我知道 mutator 可以更改其字段的值,但是要隐藏它,您需要:

  1. 数组$hidden属性
  2. 构造函数__Construct()(可选)
  3. 覆盖newFromBuilderLaravel 模型的方法方法

以下是模型中的过程app\Vote_actions.php

  1. 隐藏。假设您通常想要隐藏字段created_atupdated_atLaravel,您使用:

    protected $hidden = ['created_at', 'updated_at'];
    
  2. 外部条件。现在让我们说如果经过身份验证的用户是您想要取消隐藏它们的员工:

    public function __Construct()
    {
        parent::__construct();
    
        if(\Auth::check() && \Auth::user()->isStaff()) {
            // remove all fields so Staff can access everything for example
            $this->hidden = [];
        } else {
            // let's hide action_type for Guest for example
            $this->hidden = array_merge($this->hidden, ['action_type'];
        }
    }
    
  3. 内部条件假设现在您要隐藏anonymous字段是它的值为真:

    /**
     * Create a new model instance that is existing.
     *
     * @param  array  $attributes
     * @param  array  $connection
     * @return \Illuminate\Database\Eloquent\Model|static
     */
    public function newFromBuilder($attributes = array(), $connection = null)
    {
        $instance = parent::newFromBuilder($attributes, $connection);
    
        if((bool)$instance->anonymous === true) {
            // hide it if array was already empty
            // $instance->hidden = ['anonymous'];
    
            // OR BETTER hide single field with makeHidden method
            $instance->makeHidden('anonymous');
            // the opposite is makeVisible method
        }
    
        return $instance;
    }
    

您不能在 mutators 中使用隐藏的属性和方法,当我们需要隐藏而不是更改值时,这是它们的弱点。

但在任何情况下,要了解在百分之一的行的高负载上调用修改可能会耗费大量的时间。

于 2019-04-02T15:06:38.150 回答
2

当然,您可以轻松做到这一点。阅读访问器(getter): https ://laravel.com/docs/5.1/eloquent-mutators

例子:

function getUserIdAttribute()
{
    return $this->anonymous ? -1 : $this->user_id;
}

function getGroupIdAttribute()
{
    return $this->anonymous ? -1 : $this->group_id;
}
于 2016-03-10T06:06:51.873 回答
2

在特殊情况下,您倾向于边缘情况。

使用访问器:

class VoteActions extends \Eloquent {

    public $casts = [
        'anonymous' => 'boolean'
    ];
    ...

    /**
    * Accessors: Group ID
    * @return int
    */
    public function getGroupIdAttribute()
    {
        if((bool)$this->anonymous === true) {
            return -1;
        } else {
            return $this->group_id;
        }
    }

    /**
    * Accessors: User ID
    * @return int
    */
    public function getUserIdAttribute()
    {
        if((bool)$this->anonymous === true) {
            return -1;
        } else {
            return $this->user_id;
        }        
    }
}

官方文档:https ://laravel.com/docs/5.1/eloquent-mutators#accessors-and-mutators

但是,我建议您在必要时将数据库中的值直接设置为 -1,以保持应用程序的完整性。

于 2016-03-10T06:11:03.193 回答