在一次查询中获取所有带有广告图片的广告数据
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);
希望这对以后的人有所帮助。
第一个 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);
希望这对以后的人有所帮助。