我有一个users
表,其中包含以下架构:
Schema::create('users', function(Blueprint $table) {
$table->increments('id');
$table->string('username', 50);
$table->text('first_name');
$table->text('last_name');
$table->text('phone1');
$table->boolean('is_private_phone1');
$table->text('phone2');
$table->boolean('is_private_phone2');
$table->text('email');
$table->boolean('is_private_email');
$table->string('headshot', 32);
$table->string('password', 64);
$table->string('remember_token', 100);
$table->softDeletes();
$table->timestamps();
});
我想获取用户列表。但我不想让那些已将隐私设置为私有的phone1
,phone2
和email
退回(即如果您确实拥有隐私权,然后只返回你的名字和爆头。如果你没有,那么你的手机和电子邮件已经退回了。)
有没有办法在Eloquent中这样做?我能想到的只是获取所有行,然后手动循环遍历它们并删除列。
答案 0 :(得分:0)
我决定使用访问者。我将以下函数添加到User
模型中:
public function getEmailAttribute($value)
{
if ( ! $this->isPrivate('email')) return $value;
return null;
}
public function getPhone1Attribute($value)
{
if ( ! $this->isPrivate('phone1')) return $value;
return null;
}
public function getPhone2Attribute($value)
{
if ( ! $this->isPrivate('phone2')) return $value;
return null;
}
private function isPrivate($field)
{
$field = 'is_private_' . $field;
return $this->attributes[$field] == 1;
}
答案 1 :(得分:0)
或者,您也可以添加scope
方法,如下所示:
public function scopeWithPrivacy($query)
{
if($this->isPrivate('email')) {
return $query->select(['name', 'headshot']);
}
return $query;
}
调用方法如:
$user = User::withPrivacy()->find(1);
因此,当您调用withPrivacy()
方法时,将完成隐私检查,并相应地返回字段。