Foreach в контроллере возвращает только один выход Laravel и Ajax - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь отобразить имена из базы данных, используя Ajax, и я использую foreach l oop в контроллере, но он возвращает только одно имя вместо двух (неправильно l oop). Я видел некоторые ответы, люди предложили использовать foreach в представлении, но для моего случая я использую Ajax в представлении, как я могу использовать foreach в Ajax или есть ли способ, которым он может отображать все имена?

Я пытался использовать их, но он возвращал одно имя вместо двух.

$data = [];
$data[] = $review->user->name; 

Контроллер

  $products = Product::where('id','=',$id)->with('reviews.user')->get();
        foreach ($products as $product)
        {
            foreach ($product->reviews as $review){
                $data =  $review->user->name;
                dd($data); //This returns one name
            }
        }

Ajax

 <script >
 function userRatingname() {
    $.ajax({
        type: "GET",
        url: '{{route('userRating.name ', $id)}}',
        success: function(data) {
            $('#userRatingname').html('<div>' + data + '</div>');

        }
    });

}
userRatingname(); 
</script>

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Вы перезаписываете значение $data снова и снова, поэтому оно будет возвращать последнее имя пользователя.

Вам необходимо вывести $data = []; из l oop. и используйте $data[] = $review->user->name; внутри l oop:

$products = Product::where('id','=',$id)->with('reviews.user')->get();
$data = array(); // defined the $data here out of loop
foreach ($products as $product)
{
   foreach ($product->reviews as $review){
       $data []= $review->user->name; // push the username to $data   
   }
}
// Or you can use whereIn for User:
$data = User::whereIn('id', ProductReview::where('product_id',$id)->pluck('user_id'))->pluck('name')->toArray();

return response()->json(['code' => 200, 'data' => $data]);

Измените код ajax:

function userRatingname() {
    $.ajax({
        type: "GET",
        url: '{{route('userRating.name ', $id)}}',
        success: function(data) {
            var html = '';
            data['data'].forEach(function(name) {
                html += '<div>' + name + '</div>'
            });
            $('#userRatingname').html(html);
        }
    });
0 голосов
/ 24 марта 2020

Вы забыли добавить тег "csrf" в свой ajax вызов

0 голосов
/ 24 марта 2020

попробуйте это, если это правильно, скажите мне.

     $data = [];//define empty array.


    $products = Product::where('id','=',$id)->with('reviews.user')->first();


        foreach ($product->reviews as $review){
            $data[]= [$review->user->name];

        }

Я понимаю, что ваша проблема в том, что вы используете переменную, а не массив, поэтому в l oop u используйте массив и используйте [ваше значение хранения]

...