Запрос Laravel возвращает несколько объектов вместо одного - PullRequest
0 голосов
/ 27 июня 2019

У меня есть таблица 'posts' и таблица 'post_images'.Я пытаюсь получить данные из обеих таблиц, а также присоединить к ним таблицу «пользователей».все работает, но запрос возвращает разные объекты для каждого изображения.

Мой код AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

$.ajax({
    url: '/loadPosts',
    type: 'GET',
    dataType: 'json',
    data: {_token: "{{ csrf_token() }}"},
    success: function(r){


        console.log(r);

        r.forEach((post)=>{

                $('.posts-div').append(` 
                    <div class="card mb-3">
                      <h5 class="card-header">
                      <img src="https://www.stickpng.com/assets/images/585e4bf3cb11b227491c339a.png" style="width: 35px; height: 35px;">
                      ${post.name} ${post.surname}
                      </h5>
                      <div class="card-body">
                        <p class="card-text">${post.text}</p>
                        <img src="images/${post.link}" style="width: 100%;">
                      </div>
                    </div>
                `);

        })
    }
})

Маршрут:

Route::get('/loadPosts','UserController@loadPosts');

Функция:

public function loadPosts(){

        $my_id = Auth::user()->id;

        $posts = DB::table('posts')->where('user_id','!=',$my_id)->join('post_images','posts.id','=','post_images.post_id')->join('users','posts.user_id','=','users.id')
        ->select('image','link','name','surname','text')
        ->get()
        ->toArray();

        print_r(json_encode($posts));
    }

Вот что я получаю в успехе AJAX:

результат

В новом сообщении 3 изображения, поэтому это должен быть один объект, а не три.

1 Ответ

2 голосов
/ 27 июня 2019

Создание моделей и использование with() для загрузки реляционных данных.

для таблицы posts => App\Post.php и определить отношение как:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function images()
    {
        return $this->hasMany('App\PostImage');
    }

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

для таблицы post_images => App\PostImage.php Как:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PostImage extends Model
{
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

для таблицы users => App\User.php Как:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany('App\Post');
    }
}

Теперь в вашем UserController > loadPosts измените код Как:

public function loadPosts(){

    $my_id = Auth::user()->id;

    $posts = App::Post->with("images", "user")
                      ->where('user_id','!=', $my_id)
                      ->get()
                      ->toArray();

    print_r(json_encode($posts)); // you can see the unique posts entries along with `images` and `user` inside it.
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...