【问题标题】:Laravel Model conditional formattingLaravel 模型条件格式
【发布时间】:2016-03-10 05:49:58
【问题描述】:

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

  • 身份证
  • group_id
  • user_id
  • action_type
  • 匿名(布尔)

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

在 laravel 中有什么方法可以做到吗?

【问题讨论】:

  • 你的意思是当你实例化模型时?或者稍后您想更改这些值?
  • @harvey_slash,如果一个或两个答案有帮助,请投票并选择最佳答案。

标签: laravel laravel-5 mutators


【解决方案1】:

在特殊情况下,您倾向于极端情况。

使用访问器:

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,以保持应用程序的完整性。

【讨论】:

  • 你能给个用法吗?
【解决方案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;
}

【讨论】:

    【解决方案3】:

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

    由于我看到其他 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 字段是它的值为真:

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

    但无论如何,请理解在高达百分之一的行的高负载上调用修改可能会耗费大量时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2014-07-04
      相关资源
      最近更新 更多