2015-02-17 96 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