sql - 在 SQL RAW 查询中获取数据,格式与我们在 Laravel 中使用预加载方法获取的格式相同
问题描述
我一直在使用 Laravel Eloquent,现在我想编写 RAW 查询并用它获取数据。
我的查询(雄辩)是这样的:
$jobs = CompanyJob::where('fair_id',$fair_id);
$jobs = $jobs->with('company');
// dd($jobs->toSql());
if (!empty($jobIds)) {
$jobs = $jobs->whereIn('id',$jobIds);
}
$jobs = $jobs->orderBy('id', 'ASC');
if(isset($search) && !empty($search))
$jobs = $jobs->where(function($query) use($search){
$query->where('title','LIKE','%'.$search.'%')->OrWhere('location','LIKE','%'.$search.'%');
});
if (!empty($limit)) {
$jobs = $jobs->limit($limit);
$jobs = $jobs->offset($offset);
}
$jobs = $jobs->get();
此查询的结果是:
{
"jobs": [
{
"id": 6381,
"company_id": "1507",
"fair_id": "118",
"recruiter_id": "147143",
"title": "Master of Arts in Entrepreneurship for the Global Hospitality and Tourism Industry",
"description": "<p><span style=\"font-weight: 400;\">Här kan du hitta mer information om utbildningen!</span><span style=\"font-weight: 400;\"><br /><br /></span></p>",
"job_type": "Permanent",
"language": "English",
"location": "Brig",
"contact_name": null,
"phone": null,
"url": "https://www.studentum.se/skola/swiss-education-group/cesar-ritz-colleges/master-of-arts-in-entrepreneurship-for-the-global-hospitality-and-tourism-industry-969435",
"salary": "Competitive",
"match": "1",
"status": null,
"params": null,
"is_imported": "N",
"questionnaires_template_id": "0",
"import_ref": null,
"imported_from": null,
"match_index": "N",
"last_offset": null,
"total_records_to_index": null,
"created_at": "2021-02-27 17:22:24",
"updated_at": "2021-02-27 17:22:24",
"company": {
"id": 1507,
"admin_id": null,
"fair_id": "118",
"recruiter_id": "147136",
"company_name": "Swiss Education Group",
"company_post_code": "111",
"company_state": "Göteborg",
"company_country": "Sverige",
"company_match": "1",
"company_web_url": "https://www.studentum.se/skola/swiss-education-group/",
"company_facebook_url": null,
"company_youtube_url": null,
"company_twitter_url": null,
"company_in_url": null,
"company_instagram_url": null,
"company_stand_type": "Bronze",
"description": "<p><span style=\"font-weight: 400;\">Vilka är vi?</span></p>\r\n<p> </p>\r\n<p><span style=\"font-weight: 400;\">Swiss Education Group (SEG) är en av världens ledande leverantörer av Hotell Management, kock -och konditorutbildningar i Schweiz. Våra utbildningar är till för studenter som vill ha en internationell karriär som hotellchef, kock, konditor eller något annat yrke inom just servicebranschen.</span></p>\r\n<p> </p>\r\n<p><span style=\"font-weight: 400;\">Vi driver totalt fyra skolor på olika campus i Schweiz:</span></p>\r\n<p><span style=\"font-weight: 400;\">- Swiss Hotel Management School</span></p>\r\n<p><span style=\"font-weight: 400;\">- Culinary Arts Academy Switzerland</span></p>\r\n<p><span style=\"font-weight: 400;\">- Hotel Institute Montreux</span></p>\r\n<p><span style=\"font-weight: 400;\">- César Ritz Colleges Switzerland</span></p>\r\n<p> </p>\r\n<p><span style=\"font-weight: 400;\">Samarbeten med branschen</span></p>\r\n<p> </p>\r\n<p><span style=\"font-weight: 400;\">Samtliga skolor som ingår i vårt nätverk, är akademiskt ackrediterade och har etablerade samarbeten med många av branschens ledande företag och varumärken. Några få exempel på samarbeten är: Four Seasons, Ritz Paris, Marriott International samt lyxrestauranger världen över. Detta ger studenten en utbildning som är direkt anknuten till vad den internationella hotellbranschen efterfrågar.</span></p>\r\n<p> </p>\r\n<p><span style=\"font-weight: 400;\">Swiss Education Group (SEG) är en av världens främsta nätverk av skolor inom 'hospitality management'. Nätverkets framgång har lett till att den internationella hotellbranschen nu ställer allt högre krav på sina medarbetare. Man kan verkligen säga att SEG har höjt ribban för kvaliteten på anställda inom hospitality management.</span></p>",
"company_logo": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_image": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_banner": "assets/images/user-id-48854_SEG-roll.jpg",
"dashboard_thumbnail": null,
"company_hall": "2",
"questionnaire_selected": "0",
"enable_recruiters": "1",
"enable_webinars": "0",
"enable_goodies": "0",
"enable_media": "1",
"enable_jobs": "1",
"enable_documents": "1",
"enable_about": "1",
"enable_auto_enrolled": "0",
"enable_poll": "0",
"display_order": "0",
"created_at": "2021-02-27 16:59:10",
"updated_at": "2021-02-27 16:59:10"
}
},
{
"id": 6480,
"company_id": "1521",
"fair_id": "118",
"recruiter_id": "147575",
"title": "Master of Arts in Entrepreneurship for the Global Hospitality and Tourism Industry",
"description": "<p><span style=\"font-weight: 400;\">Här kan du hitta mer information om utbildningen!</span><span style=\"font-weight: 400;\"> </span></p>",
"job_type": "Permanent",
"language": "English",
"location": "Brig",
"contact_name": null,
"phone": null,
"url": "https://www.studentum.se/skola/swiss-education-group/cesar-ritz-colleges/master-of-arts-in-entrepreneurship-for-the-global-hospitality-and-tourism-industry-969435",
"salary": "Competitive",
"match": "1",
"status": null,
"params": null,
"is_imported": "N",
"questionnaires_template_id": "0",
"import_ref": null,
"imported_from": null,
"match_index": "N",
"last_offset": null,
"total_records_to_index": null,
"created_at": "2021-03-01 00:39:05",
"updated_at": "2021-03-01 00:39:05",
"company": {
"id": 1521,
"admin_id": null,
"fair_id": "118",
"recruiter_id": null,
"company_name": "Swiss Education Group",
"company_post_code": "111",
"company_state": "Malmö",
"company_country": "Sverige",
"company_match": "1",
"company_web_url": "https://www.studentum.se/skola/swiss-education-group/",
"company_facebook_url": null,
"company_youtube_url": null,
"company_twitter_url": null,
"company_in_url": null,
"company_instagram_url": null,
"company_stand_type": "Bronze",
"description": "<p>Vilka är vi? <br /> <br /> Swiss Education Group (SEG) är en av världens ledande leverantörer av Hotell Management, kock -och konditorutbildningar i Schweiz. Våra utbildningar är till för studenter som vill ha en internationell karriär som hotellchef, kock, konditor eller något annat yrke inom just servicebranschen. <br /> <br /> Vi driver totalt fyra skolor på olika campus i Schweiz: <br /> - Swiss Hotel Management School <br /> - Culinary Arts Academy Switzerland <br /> - Hotel Institute Montreux <br /> - César Ritz Colleges Switzerland <br /> <br /> Samarbeten med branschen <br /> <br /> Samtliga skolor som ingår i vårt nätverk, är akademiskt ackrediterade och har etablerade samarbeten med många av branschens ledande företag och varumärken. Några få exempel på samarbeten är: Four Seasons, Ritz Paris, Marriott International samt lyxrestauranger världen över. Detta ger studenten en utbildning som är direkt anknuten till vad den internationella hotellbranschen efterfrågar. <br /> <br /> Swiss Education Group (SEG) är en av världens främsta nätverk av skolor inom 'hospitality management'. Nätverkets framgång har lett till att den internationella hotellbranschen nu ställer allt högre krav på sina medarbetare. Man kan verkligen säga att SEG har höjt ribban för kvaliteten på anställda inom hospitality management. <br /> </p>",
"company_logo": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_image": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_banner": "assets/images/user-id-48854_SEG-roll.jpg",
"dashboard_thumbnail": null,
"company_hall": "3",
"questionnaire_selected": "0",
"enable_recruiters": "1",
"enable_webinars": "0",
"enable_goodies": "0",
"enable_media": "1",
"enable_jobs": "1",
"enable_documents": "1",
"enable_about": "1",
"enable_auto_enrolled": "0",
"enable_poll": "0",
"display_order": "0",
"created_at": "2021-03-01 00:13:26",
"updated_at": "2021-03-01 00:13:26"
}
},
{
"id": 6520,
"company_id": "1528",
"fair_id": "118",
"recruiter_id": "147609",
"title": "Master of Arts in Entrepreneurship for the Global Hospitality and Tourism Industry",
"description": "<p><span style=\"font-weight: 400;\">Här kan du hitta mer information om utbildningen!</span> <span style=\"font-weight: 400;\"> </span></p>",
"job_type": "Permanent",
"language": "English",
"location": "Brig",
"contact_name": null,
"phone": null,
"url": "https://www.studentum.se/skola/swiss-education-group/cesar-ritz-colleges/master-of-arts-in-entrepreneurship-for-the-global-hospitality-and-tourism-industry-969435",
"salary": "Competitive",
"match": "1",
"status": null,
"params": null,
"is_imported": "N",
"questionnaires_template_id": "0",
"import_ref": null,
"imported_from": null,
"match_index": "N",
"last_offset": null,
"total_records_to_index": null,
"created_at": "2021-03-01 01:29:33",
"updated_at": "2021-03-01 01:29:33",
"company": {
"id": 1528,
"admin_id": null,
"fair_id": "118",
"recruiter_id": null,
"company_name": "Swiss Education Group",
"company_post_code": "111",
"company_state": "Stockholm",
"company_country": "Sverige",
"company_match": "1",
"company_web_url": "https://www.studentum.se/skola/swiss-education-group/",
"company_facebook_url": null,
"company_youtube_url": null,
"company_twitter_url": null,
"company_in_url": null,
"company_instagram_url": null,
"company_stand_type": "Bronze",
"description": "<p>Vilka är vi? <br /> <br /> Swiss Education Group (SEG) är en av världens ledande leverantörer av Hotell Management, kock -och konditorutbildningar i Schweiz. Våra utbildningar är till för studenter som vill ha en internationell karriär som hotellchef, kock, konditor eller något annat yrke inom just servicebranschen. <br /> <br /> Vi driver totalt fyra skolor på olika campus i Schweiz: <br /> - Swiss Hotel Management School <br /> - Culinary Arts Academy Switzerland <br /> - Hotel Institute Montreux <br /> - César Ritz Colleges Switzerland <br /> <br /> Samarbeten med branschen <br /> <br /> Samtliga skolor som ingår i vårt nätverk, är akademiskt ackrediterade och har etablerade samarbeten med många av branschens ledande företag och varumärken. Några få exempel på samarbeten är: Four Seasons, Ritz Paris, Marriott International samt lyxrestauranger världen över. Detta ger studenten en utbildning som är direkt anknuten till vad den internationella hotellbranschen efterfrågar. <br /> <br /> Swiss Education Group (SEG) är en av världens främsta nätverk av skolor inom 'hospitality management'. Nätverkets framgång har lett till att den internationella hotellbranschen nu ställer allt högre krav på sina medarbetare. Man kan verkligen säga att SEG har höjt ribban för kvaliteten på anställda inom hospitality management. <br /> </p>",
"company_logo": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_image": "assets/images/user-id-48854_SEG-logga.png",
"company_stand_banner": "assets/images/user-id-48854_SEG-roll.jpg",
"dashboard_thumbnail": null,
"company_hall": "1",
"questionnaire_selected": "0",
"enable_recruiters": "1",
"enable_webinars": "0",
"enable_goodies": "0",
"enable_media": "1",
"enable_jobs": "1",
"enable_documents": "1",
"enable_about": "1",
"enable_auto_enrolled": "0",
"enable_poll": "0",
"display_order": "0",
"created_at": "2021-03-01 01:19:58",
"updated_at": "2021-03-01 01:19:58"
}
}
]
}
我想为此编写 RAW 查询,首先我使用了 $jobs->toSlq()但这并没有给我查询with() 所以我搜索并发现为此我必须使用
DB::enableQueryLog(); and DB::getQueryLog();
然后我得到以下结果:
array:2 [
0 => array:3 [
"query" => "select * from `company_jobs` where `fair_id` = ? and (`title` LIKE ? or `location` LIKE ?) order by `id` asc"
"bindings" => array:3 [
0 => "118"
1 => "%the%"
2 => "%the%"
]
"time" => 4.88
]
1 => array:3 [
"query" => "select * from `companies` where `companies`.`id` in (?, ?, ?)"
"bindings" => array:3 [
0 => "1507"
1 => "1521"
2 => "1528"
]
"time" => 0.27
]
]
我仍然无法理解如何编写查询以获取上述数据。我将如何在原始查询中获取 company.id 以及公司记录将如何与工作数据等相结合?谁能帮我在 RAW SQL 查询中编写 Eloquent 查询?我也想知道with()在 Laravel 中是如何工作的?
模型的关系是:
Job->belongsTo('Company') and
Company->hasMany('CompanyJob')
解决方案
关于如何with
工作,答案是IN()
SQL 语句。尽管理论上使用不同的连接或数据库引擎,但您能够让 Model 类相互关联,这是因为 Laravel 不会生成JOIN
语句。(我过去曾尝试使其基于模型配置生成真正的 JOIN,并很快发现在尝试保持表名别名以保持其唯一性时事情变得棘手,但仍然能够在结果中引用它们) .
因此,$model->with('relation')
将导致以下效果:
SELECT * FROM $model::$table;
SELECT * FROM $model->relation()->getTable() WHERE $model->relation()->getKeyName() IN(Model-defined foreign key results from previous query);
至于如何实际查看生成的查询,我编写了一个调试助手,它提供了这样的功能: https : //gist.github.com/kmuenkel/a6b4e34e5bf6ca44e3c85bf753111850甚至使用反射在详细信息中包含字段名称和默认值: https ://gist.github.com/kmuenkel/4a1a8a10e0f68a7e3439c4f612523ec7
一旦这些连接起来,您只需在执行查询之前调用。然后在之后的任何时候再次调用它,并转储结果:
debug_query();
$model->with(...)->get();
dd(debug_query()->toArray());
这将向您显示在点 A 和 B 之间执行的所有查询。例如,如果您将它们放在函数调用之前和之后,查询在下游某处运行,并且您希望包含从其中调用查询的跟踪详细信息,您也可以拉入 DebugTrace 代码,并将true
其作为参数添加到 point-A 函数调用中。
推荐阅读
- firebase - Flutter 设计模式:混合构建方法和异步函数
- c++ - 二进制搜索功能 - 即使在数组中找不到数字,也会输出比较次数
- unit-testing - 当连接位于结构中时,我应该如何在 Go 中模拟 Redis 连接?
- r - 使用两个时间序列列转换数据
- excel - 图表表复制并粘贴到电源点
- java - Comparator.reverseOrder() 与 Collections.reverseOrder()
- javascript - 递归替换函数需要说明
- xcode - 如何更好地诊断 macOS 上的特定代码设计错误?
- python - 如何在python中堆叠seaborn pairgrids
- php - 如何解决未捕获的错误:找不到类“mysqli”