Laravel离开加入没有正确返回

时间:2014-07-03 16:09:07

标签: php mysql laravel

我使用leftJoin选择了laravel。我正在尝试选择2个帖子并计算有多少评论(第一篇文章有​​7篇评论,第二篇为0),但我只收到了7条评论的第一篇帖子。

代码是:

$posts = DB::table('posts')
        ->leftJoin('comments', 'comments.post', '=', 'posts.id')
        ->select(DB::raw('posts.title, posts.body, posts.created_at, posts.slug, CASE WHEN comments.post IS NULL THEN 0 WHEN comments.post IS NOT NULL THEN count(comments.post) END as count'))
        ->get();

当我试图检查我在网络浏览器中看到的内容时,我收到了错误消息: Call to a member function count() on a non-object

我的视图文件中使用@if($posts->count())

的行中出现此错误

我已经调试过,我只使用print_r()发了一个帖子。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为你最好的选择是使用laravel的Eloquent ORM的一些内置功能。

在模型中建立关系:

<强> post.php中:

<?php

class Post extends Eloquent {

   protected $table = 'posts';

   public function comments()
   {
      return $this->hasMany('Comment', 'posts');//first param refrences the other model, second is the foreign key
   }

<强> Comment.php:

<?php

class Comment extends Eloquent {

   protected $table = 'comments';

   public function comments()
   {
      return $this->belongsTo('Post');//first param refrences the other model, second is unnecessary if you are using auto incrementing id
   }

现在您已建立关系,无需加入。

<强>用法:

可能有更好的方法来做到这一点,但这应该有用。

  $posts = Post::with('comments')->get();//retrieves all posts with comments
   foreach($posts as $post){
     $count = count($post['comments']);
     $post['comment_count'] = $count;
  }
  return $posts;

这将返回包含所有帖子的结果,其中包含一个名为“comments”的字段,其中包含所有相关注释的数组。 'comment_count'字段将包含计数。

示例:

[
  {
   "id": 1,
    "created_at": "2014-07-02 11:34:00",
    "updated_at": "2014-07-02 11:34:00",
    "post_title": "hello there",
    "comment_count": 1,
    "comments": [
        {
          "id":'blah'
          "comment_title":"blah"
        }
     ]

}

您现在可以将其传递给您的视图并循环浏览每个帖子并获取$post['comment_count']