我有一个名为Vote_actions的数据库和模型,如下所示:
用户可以要求匿名(这会使布尔值为true)。如果是这种情况,我想将group_id和user_id从返回的模型更改为-1。
拉拉维尔有没有办法让我能做到?
答案 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可以更改其字段的值,但是要隐藏它,您需要:
$hidden
数组属性__Construct()
(可选)newFromBuilder
,以下是模型app\Vote_actions.php
中的过程:
隐藏。假设您通常要隐藏Laravel的字段created_at
和updated_at
,请使用:
protected $hidden = ['created_at', 'updated_at'];
外部条件。现在让我们说一下,如果“身份验证用户”是“职员”,您想取消隐藏他们:
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'];
}
}
内部条件假设您现在想隐藏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中使用隐藏的属性和方法,这是我们需要隐藏而不是更改值时它们的弱点。
但是无论如何,要了解在百分之一的高负载下调用修改会花费大量时间。