Получить значение объекта на итерации массива с помощью foreach - PullRequest
0 голосов
/ 07 января 2020

В следующем очень упрощенном примере и учебном примере мы получаем список постов и количество комментариев для каждого поста.

Однако я намеревался отправить на сторону клиента только значение, т.е. 2 , а не объект массива [{total: 2}]

Есть ли упрощенный способ сделать это с laravel?

Примечание: необходимо использовать DB :: select

public function readPosts(Request $request) {     
    $posts = DB::select("SELECT * FROM posts");   

     foreach ($posts as $key => $post) {         
         $idComment = $post->id_comment;             
         $post->nComments = DB::select('SELECT COUNT(id_comment) As total FROM post_comments WHERE id_comment = ? ', [$idComment]); 
     }    

    if($posts){
      return response()->json(['success'=>true, "output"=>$posts);
    }else{
      return response()->json(['success'=>false]);  
    }
}

ответ

data:
    0:
      id_post: 1
      post: "post text"
      nComments: [{total:2}]
   1:
      id_post: 2
      post: "post text 2"
      nComments: [{total:1}]

Ожидается

data:
    0:
      id_post: 1
      post: "post text"
      nComments: 2
    1:
      id_post: 2
      post: "post text 2"
      nComments: 1

Ответы [ 5 ]

1 голос
/ 07 января 2020

Попробуйте это просто

 $posts = Post::withCount('comments');  
 dd($post);
1 голос
/ 07 января 2020

Я полагаю, что вы можете использовать Eloquent с быстрой загрузкой, чтобы получить счет. Однако вам нужно восстановить таблицы и построить отношения с вашими моделями.

Если вы действительно хотите использовать DB::select(),

Вы можете просто использовать подзапрос

$posts = DB::select('
SELECT posts.*, (
    SELECT COUNT(id_comment)  AS total
    FROM post_comments 
    WHERE id_comment = posts.id_comment) AS total
FROM posts')
1 голос
/ 07 января 2020

Вы можете попробовать это

 public function readPosts(Request $request) {     
            $posts = DB::select("SELECT * FROM posts");   

             foreach ($posts as $key => $post) {         
                 $idComment = $post->id_comment; 
                 $total = DB::select('SELECT COUNT(id_comment) As total FROM post_comments WHERE id_comment = ? ', [$idComment]);        
                 $post->nComments = $total[0]['total'];
             }    

            if($posts){
              return response()->json(['success'=>true, "output"=>$posts);
            }else{
              return response()->json(['success'=>false]);  
            }
        }
1 голос
/ 07 января 2020

Чистым способом было бы использовать отношения comments сообщения

public function readPosts(Request $request) {     
    $posts = DB::withCount('comments')->get();   

    if($posts){
      return response()->json(['success'=>true, "output"=>$posts);
    }else{
      return response()->json(['success'=>false]);  
    }
}

ответ

data:
    0:
      id_post: 1
      post: "post text"
      comments_count: 2
   1:
      id_post: 2
      post: "post text 2"
      comments_count: 1

Плюс : Это позволит использовать загрузку в Eloquent, и результаты будут намного быстрее и эффективнее.

1 голос
/ 07 января 2020

Вы можете использовать count () для подсчета коллекций.

 foreach ($posts as $key => $post) {         
         $idComment = $post->id_comment;             
         $comments = DB::select('SELECT COUNT(id_comment) As total FROM post_comments WHERE id_comment = ? ', [$idComment]); 
         $post->nComments = $comments[0]['total'];
     }    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...