[英]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.