Laravel Eloquent:一对多的关系,与众不同

时间:2020-08-27 12:50:31

标签: laravel eloquent greatest-n-per-group one-to-many eloquent-relationship

需要获得不同的行。

laravel是否有雄辩的方法来避免重复数据。 加入图片表格后需要获得唯一身份的用户。

现在,我有相同的用户,需要避免重复相同的用户。

模型图片

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

用户表

id | name
---------
| 1| Joe
| 2| Ben
| 3| Don

图像表

id  |   name | user_id
---------------------
| 1 |  1.png |    3
| 2 |  2.png |    1
| 3 |  3.png |    1
| 4 |  4.png |    2

使用雄辩的方式加入:

Image::with('user')->orderBy('id', 'desc')->paginate(10);

必需的输出

"data": [
    {
        "id": 4,
        "name": "4.png",
        "user_id": 2,
        "user": {
            "id": 2,
            "name": "Ben",
        }
    },
    {
        "id": 3,
        "name": "3.png",
        "user_id": 1,
        "user": {
            "id": 1,
            "name": "Joe",
        }
    },
    {
        "id": 1,
        "name": "1.png",
        "user_id": 3,
        "user": {
            "id": 3,
            "name": "Don",
        }
    },
],

3 个答案:

答案 0 :(得分:0)

要从雄辩的调用链中的 unique()方法中获得唯一的结果。

Image::with('user')
      ->orderBy('id', 'desc') 
      ->paginate(10)
      ->unique() // Like this

如果上述方法无效,请尝试以下方法。

Image::with('user')
      ->orderBy('id', 'desc') 
      ->paginate(10)
      ->unique()
      ->values()

答案 1 :(得分:0)

听起来您想要所有用户,而每个用户只需要一张图像。您可以执行以下操作,将图像关系添加到用户模型:

message.LastReadAt = &now // field LastReadAt *time.Time`example:"2020-05-01T15:00:00Z"` of Message type

然后,您将像Cannot use '&now' (type *string) as type *time.Time 这样访问这些数据;

答案 2 :(得分:0)

要获取每个用户的最新图片,您可以使用自加入之类的方法

模式

CREATE TABLE users
    (`id` int, `name` varchar(3))
;
    
INSERT INTO users
    (`id`, `name`)
VALUES
    (1, 'Joe'),
    (2, 'Ben'),
    (3, 'Don')
;

CREATE TABLE images
    (`id` int, `name` varchar(5), `user_id` int)
;
    
INSERT INTO images
    (`id`, `name`, `user_id`)
VALUES
    (1, '1.png', 3),
    (2, '2.png', 1),
    (3, '3.png', 1),
    (4, '4.png', 2)
;

查询

select a.*, u.*
from images a
left join images b on a.user_id = b.user_id
  and a.id < b.id
join users u on u.id = a.user_id
where b.user_id is null
order by a.id desc

查询生成器

DB::table('images as a')
  ->select('a.*, u.*')
  ->leftJoin('images as b', function ($join) {
        $join->on('a.user_id', '=', 'b.user_id')
             ->whereRaw(DB::raw('a.id < b.id'));
   })
  ->join('users as u', 'u.id', '=', 'a.user_id' )
  ->whereNull('b.user_id')
  ->orderBy('a.id', 'desc')
  ->get();

DEMO

相关问题