Laravel Model条件格式

时间:2016-03-10 05:49:58

标签: laravel laravel-5 mutators

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

  • ID
  • GROUP_ID
  • USER_ID
  • ACTION_TYPE
  • 匿名(布尔)

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

拉拉维尔有没有办法让我能做到?

3 个答案:

答案 0 :(得分: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,以保持应用程序的完整性。

答案 1 :(得分:0)

当然,你可以很容易地做到这一点。阅读有关访问者(getters)的信息: https://laravel.com/docs/5.1/eloquent-mutators

示例:

       var firstTime = new Date().getTime();
       if(window.localStorage.getItem('firstTime') == null){
            window.localStorage.setItem('firstTime', firstTime);
        }else{
            var secondTime = new Date().getTime();
            var storedTime = window.localStorage.getItem('firstTime');
            if(secondTime > storedTime){
                alert("Second time");
            }else{
                alert("First time");
            }
        }

答案 2 :(得分:0)

我知道这个问题很旧。我一直在寻找一种在某些条件下隐藏某些字段的方法,例如 Auth Roles 之类的外部条件以及 Model属性之类的内部条件,我发现了一种非常灵活的隐藏方法他们。

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

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

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

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

  1. 隐藏。假设您通常要隐藏Laravel的字段created_atupdated_at,请使用:

    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字段,因为它的值为true:

    /**
     * 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中使用隐藏的属性和方法,这是我们需要隐藏而不是更改值时它们的弱点。

但是无论如何,要了解在百分之一的高负载下调用修改会花费大量时间。