根据隐私返回带有列的Eloquent行

时间:2014-11-10 19:17:01

标签: laravel-4 eloquent

我有一个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();
    });

我想获取用户列表。但我不想让那些已将隐私设置为私有的phone1phone2email退回(即如果您确实拥有隐私权,然后只返回你的名字和爆头。如果你没有,那么你的手机和电子邮件已经退回了。)

有没有办法在Eloquent中这样做?我能想到的只是获取所有行,然后手动循环遍历它们并删除列。

2 个答案:

答案 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()方法时,将完成隐私检查,并相应地返回字段。