在 Laravel 中返​​回多对多关系的统一 JSON

Posted

技术标签:

【中文标题】在 Laravel 中返​​回多对多关系的统一 JSON【英文标题】:Return unified JSON of many to many relationship in Laravel 【发布时间】:2021-11-08 20:17:39 【问题描述】:

我无法理解这一点。我有三个表(缩写):

*images*
id | label | …

*keywords*
id | label | …

*image_keyword*
image_id | keyword_id

我在模型中定义了它们的多对多关系:

*Image.php*
public function keywords()

    return $this->belongsToMany(Keyword::Class);


*Keyword.php*
public function images()

    return $this->belongsToMany(Image::Class);

有一次我通过这段代码实现了一个惰性模糊搜索:

$terms = explode(' ', $request->input('q'));
$query = DB::connection('pia')->table('images');

foreach($terms as $k => $term) 
    $query->where(DB::raw('lower(images.title)'), 'like', '%' . strtolower($term) . '%');


return response()->json($query->get());

目前还不错。现在我很想将关键字添加到我传递回前端的图像对象中,但我没有设法产生一个有效的解决方案。我不是数据库设计和代码方面的专家。

我希望将关键字与图像对象一起传递,如下所示:


    'id': 123,
    'label': 'Dog',
    'file': '/data/images/dog.jpg',
    'keywords': [
        
            'id': 312,
            'label': 'Animal'
        ,
        
            'id': 313,
            'label': 'Pet'
    ],

我尝试了连接,但无法产生任何工作结果。

【问题讨论】:

【参考方案1】:

我认为您对此有两种解决方案

1- 你可以尝试这样的连接

$query = DB::connection('pia')->table('images');
$query->select('images.*','keywords.id,label')      
        ->join('image_keyword','images.id','image_keyword.image_id')
        ->leftJoin('keywords','image_keyword.keyword_id','keywords.id');
foreach($terms as $k => $term) 
    $query->where(DB::raw('lower(images.title)'), 'like', '%' . strtolower($term) . '%');
;
return response()->json($query->groupBy(images.id)->get());
        

2- 最简单的解决方案是像这样使用 laravel eloquent 模型

$query = Image::with('keywords:id,label');
foreach($terms as $k => $term) 
    $query->where(DB::raw('lower(images.title)'), 'like', '%' . strtolower($term) . '%');


return response()->json($query->get());

【讨论】:

第二个例子就像一个魅力,它很漂亮。我越过了 with 关键字,但不知何故没有正确实现它或类似的东西。非常感谢。

以上是关于在 Laravel 中返​​回多对多关系的统一 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多对多关系( hasMany 或 belongsToMany )

Laravel:无法添加记录多对多关系

Laravel 上的多对多问题关系

Laravel5.1 模型 --多对多关系

在事件监听器中同步多对多关系(Laravel 5.7)

Laravel 4.1 多对多关系和条件在哪里?