我使用mysql 5.7
和skill_id
数据库创建了一个项目。我在这个名为驱动程序和客户的项目中有两个角色。
在我的项目中,驾驶员可以选择多种技能并为每种技能添加多个标签,并且客户可以注册包含多个项目的订单。在order_items中,每个项目都可以绑定到一个技能和多个标签
注意:用户Group - Category - Subcategory - Item
有4个部分skill_id
,G1-C2-S3
的每个部分都解释了技能等级,例如{_ 1}}等skill_id意味着用户选择了此级别的所有项目,因为用户刚刚选择了三个级别
此技能用户中的另一个例子skill_id G5-C5-S2-T7
刚刚选择了group5的category5的子类别2的item7
注意:用户skill_id
级别部分未修复
用户技能的表格如下:
skill_id user_id
________________________
G1-C2-S3 2
G2-C4 2
G5-C5-S2-T7 2
用户技能标签表
skill_id user_id tag
_______________________________
G1-C2-S3 2 nice
G1-C2-S3 2 good
G1-C2-S3 2 bad
G2-C4 2 xxx
G2-C4 2 yyy
G5-C5-S2-T7 2 zz
G5-C5-S2-T7 2 jjj
订单表是:
id title
________________
3 egergr
3 ergervv
3 ergerger
订单商品表是:
item_id order_id tags
__________________________________
G1-C2-S3-t2 3 nice
G2-C4-S6-t3 3 yyy
G5-C5-S2-T7 3 zz
Notic:处于注册顺序的用户可以为每个项目选择最后一级的skill_id,因此item_id
始终是技能的4部分并且它已经修复
如何编写一个查询,将客户订单绑定到具有匹配技能的驱动程序,并将其标记绑定到订单商品及其标签?
我写了下面的代码,但没有作品
$skills = UsersSkills::with('tags')->where('user_id',$biker_id)->get();
$revisions = function ($query) use($skills)
{
foreach($skills as $skill)
{
$tags = ($skills[0]['tags']->toArray() !== []) ? $skills[0]['tags']->toArray() : null;
$tags_values = (!is_null($tags)) ? array_column($tags, 'tag') : null;
$query->where('item_id','LIKE',$skills[0]['skill_id'].'%')->whereIn('tags',$tags_values);
}
};
$orders = Order::whereHas('order_items', $revisions)->where(function($query) use($maxLat,$minLat,$maxLon,$minLon,$biker_search_time,$estimation_id) {
$query->where('done_by_expert',1);
$query->whereBetween('destination_longitude', [$minLon, $maxLon]);
$query->whereBetween('destination_latitude',[$minLat,$maxLat]);
$query->where('status','=','pending');
$query->where('type','=',NULL);
$query->where('vehicle_type_id',$estimation_id);
$query->whereNull('favorites');
$query->where('created_at','>=',Carbon::now()->subMinute($biker_search_time));
})->get();