首页 > 解决方案 > Laravel 查询返回多个对象而不是一个

问题描述

我有一个“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 张图片,所以它必须是一个对象,而不是三个。

标签: jqueryajaxlaravel

解决方案


创建模型并用于with()加载关系数据。

对于 table 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.
}


推荐阅读