在一次查询中获取所有带有广告图片的广告数据

Get all ads data with ads images in one query

第一个 table 名称 my_ads 和条目

+----+-------------+--------+----------+---------+
| id | title       | gender | country  | user_id |
+----+-------------+--------+----------+---------+
| 35 | NOman Javed | male   | Pakistan | 1       |
| 34 | Noman Javed | male   | Pakistan | 1       |
| 33 | Noman Javed | male   | Pakistan | 1       |
| 32 | Noman Javed | male   | Pakistan | 1       |
| 31 | Noman Javed | male   | Pakistan | 1       |
+----+-------------+--------+----------+---------+

第二 table ads_images

+----+-----------+---------------------------------+
| id | my_ads_id | image_path                      |
+----+-----------+---------------------------------+
| 28 | 35        | 1645180564-Screenshot-(529).png |
| 27 | 35        | 1645180562-Screenshot-(528).png |
| 26 | 35        | 1645180558-Screenshot-(527).png |
| 25 | 34        | 1645180318-Screenshot-(529).png |
| 24 | 34        | 1645180316-Screenshot-(528).png |
+----+-----------+---------------------------------+

我已经编写了查询并将其合并到一个数组值中,但我希望通过一个查询完成它。

$all_ads = DB::table('my_ads')->get();

$my_ads_images = DB::table('ads_images')->select('id','my_ads_id', 'image_path')- 
>groupBy('my_ads_id')->get();

然后在子索引

的一个数组中使用两个tables值进行编译
foreach($all_ads as $ads_key => $ads) {

    $my_ads_array[$ads_key]['id'] = $ads->id;
    $my_ads_array[$ads_key]['title'] = $ads->title;

    foreach($my_ads_images as $my_ads_image) {
        if($ads->id == $my_ads_image->my_ads_id) {
            $my_ads_array[$ads_key]['image_path'] = $my_ads_image->image_path;
        }
    }
}

我可以编写查询以通过一个查询实现 $my_ads_array[$ads_key]['image_path'] = array of images here 吗?我正在使用 Laravel 8 with MySQL.

我知道这是一个基本查询,但我不知道它是如何工作的。我试过加入,但不知道为什么对我不起作用。

Looking for output like this:

[0] => Array
    (
        [id] => 35
        [title] => Noman Javed
        [gender] => male            
        [description] => Height: 5.6''
        [country] => Pakistan
        [image_path] => Array
            (
                [0] => 1645180558-Screenshot-(527).png
                [1] => 1645180562-Screenshot-(528).png
                [2] => 1645180564-Screenshot-(529).png
            )

        [created_at] => 2022-02-18 10:35:49

    )

您需要添加一个JOIN(基本解释https://www.w3schools.com/sql/sql_join.asp)到

$my_ads_images = DB::table('ads_images')->select('id','my_ads_id', 'image_path')- 
>groupBy('my_ads_id')->get();

像这样:

$my_ads_images = DB::table('ads_images')->join('my_ads', 'my_ads.id', '=', 'ads_images.my_ads_id')->select('id','my_ads_id', 'image_path')->groupBy('my_ads_id')->get();

语法可能略有不同,因为您没有指定您究竟使用什么来构建查询,但这应该让您大致了解要做什么

您不能在查询结果中采用数组格式的响应,但您可以获得用逗号分隔的响应。试试下面的代码

SELECT m.*, GROUP_CONCAT(a.image_path SEPARATOR ', ') FROM my_ads m inner join ads_images a  on m.id=a.my_ads_id group by m.id;

当你得到响应时,然后在上面放一个循环并展开这个

a.image_path

用逗号,你会得到数组。

我将@Shaniawan 的MySQL 查询转换为laravel 语法,并在returns my_ads 的所有条目且仅[=16] 的查询中放置左连接=] 有图像。

$my_ads_and_images = DB::table('my_ads')
    ->leftJoin('ads_images', 'my_ads.id', '=', 'ads_images.my_ads_id')
    ->select('my_ads.*', DB::raw('group_concat(ads_images.image_path) as image_path'))
    ->groupBy('my_ads.id')
    ->paginate(12);

希望这对以后的人有所帮助。