繁体   English   中英

雄辩的关系

[英]Eloquent Relationships

长话短说:我正在建立一个“隐私”页面,用户可以选择在其个人资料中显示的内容和不显示的内容。

我正在考虑拥有一个1:m表user:privacy,并且只有他们想要私有的键条目。 如果它们不存在,则它们是公开的。 希望这是有道理的。

该表将是user_privacy,将具有3列:id,user_id,privacy_key(字符串,即电子邮件/电话/手机/等)

有没有一种方法可以简单地通过键进行查询,我将定义我可以运行以确定用户是否具有键,或者我是否需要额外的长度才能向用户模型添加功能来做到这一点(尝试避免,喜欢雄辩的魔力)

基本上我想有一个条件听起来像是“如果($ user-> privacy->电子邮件或$ user-> privacy->电话)”

谢谢,希望我很清楚,大声笑

您可以向用户模型添加功能:

public function isPrivate($attribute){
    $privacyAttribute = $this->privacy->first(function($model) use ($attribute){
        return $model->key == $attribute;  // key being the column in the privacy model
    });
    return !is_null($privacyAttribute);
}

然后以这种方式执行if语句:

if ($user->isPrivate('email') or $user->isPrivate('phone'))

或不同的实现(用法是相同的)

private $privacyAttributes = null;

public function isPrivate($attribute){
    if($this->privacyAttributes == null){
        $this->privacyAttributes = $this->privacy()->lists('key');
    }
    return in_array($attribute, $this->privacyAttributes);
}

用户模型标题:

/**
 * Class User
 * @package Interallmas
 */
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

/**
 * @var null|array
 */
protected $privacy_keys = NULL;

隐私关系:

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function privacy() {
        return $this->hasMany('Interallmas\Privacy');
    }

隐私功能:

/**
     * @return bool
     */
    public function privacy_initialized() {
        return ($this->privacy_keys !== NULL);
    }

    /**
     * @return void
     */
    public function initialize_privacy() {
        if (!$this->privacy_initialized()) {
            $this->privacy_keys = [];
            foreach ($this->privacy as $privacy) {
                $this->privacy_keys[] = $privacy->privacy_key;
            }
        }
    }

    /**
     * @param $key
     * @return bool
     */
    public function isPrivate($key) {
        $this->initialize_privacy();
        return (in_array($key,$this->privacy_keys));
    }

因此:每当我访问isPrivate($ key)方法时,我都会缓存结果以备下次使用,这样我就不会对服务器造成太大的压力-函数可以被访问一次或多次-第一次,我只查询一次。 我相信对于我的需求,这是最好的方法。

我认为简单的计数> 0检查就足够了。 这要求您已为用户模型定义了具有hasMany方法的关系。

if (count($user->privacy) > 0) {
   ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM