2015-02-17 97 views
3

我写照片的帖子一个网站,我与喜欢这些功能(它们决定用户是否喜欢特定的岗位或没有)Laravel模型返回null关系?

邮政型号:

public function likes() 
{ 
    return $this->hasMany('Like'); 
} 

public function isLiked() 
{ 
    return $this->likes()->where('user_id', Auth::user()->id); 
} 

柱控制器功能,例如:

public function postsByType($type) 
{ 
    if($this->user){ 
     $posts = Post::with('isLiked')->where('type', '=', $type)->paginate(12); 
    } else { 
     $posts = Post::where('type', '=', $type)->paginate(12); 
    } 
    return $posts; 
} 

有没有办法在模型函数返回在不登录的用户,不运行查询

我想避免编写如果中柱控制器

我想到了以下解决方案,但它不工作...

public function isFollowing() 
{ 
    return $this->setRelation('isFollowing', null); 

} 

收到此错误: Call to undefined method Illuminate\Database\Query \Builder::addEagerConstraints()

+1

通过*用户没有连接时*你的意思是,如果用户没有登录? – lukasgeiter 2015-02-17 20:17:13

+0

确切地说,当Auth :: user() - > id没有设置时的意思 – 2015-02-17 20:17:45

回答

3

因为你可能总是想要获取关系(除非没有用户登录),我建议你做这样的事情在你的模型:
(我也改名关系liked,稍后你会明白为什么)

public function newQuery(){ 
    $query = parent::newQuery(); 
    if(Auth::check()){ 
     $query->with('liked'); 
    } 
    return $query; 
} 

现在每一个查询与模型with('isLiked')运行时间将被添加,如果用户是

尽管如此,仍然存在一个问题。如果您访问isLiked,则查询将会运行。甚至对于每一篇文章,因为它不是渴望加载。

public function getIsLikedAttribute(){ 
    if(Auth::guest) return false; 
    return ! $this->liked->isEmpty(); 
} 

所以在你看来你可以这样做::您可以通过添加一个属性访问器修复

@if($post->isLiked) 

注:这将是更好的移动里面的东西newQuery()到全球范围。如果您有兴趣,请务必查看the documentation中的操作方法。

下面是范围示例。创建一个类,姑且称之为LikedScope

class LikedScope implements Illuminate\Database\Eloquent\ScopeInterface { 
    public function apply(Builder $builder, Model $model){ 
     if(Auth::check()){ 
      $builder->with('liked'); 
     } 
    } 

    public function remove(Builder $builder, Model $model){ 

    } 
} 

然后将其添加到您的模型:

public static function boot(){ 
    parent::boot(); 
    static::addGlobalScope(new LikedScope); 
} 
+0

我阅读了文档,我不明白我在哪里编写特质?我如何使用它?你能写一个例子吗? :( – 2015-02-17 20:46:19

+1

你不需要特质,这只是为了使示波器更具可重用性。 – lukasgeiter 2015-02-17 20:54:04

+0

遇到麻烦,修复它:public function getLikedAttribute(){if(Auth :: guest())return false; return(bool)count($ this-> relations ['liked']); }是吗? – 2015-02-18 00:05:16