Php Laravel-跨两个表使用where连接
我有表“jobs”,按job\u id索引,还有外键为“job\u id”的表讨论 在工作中,我有一个叫做“总结”的专栏,在讨论中,我有一个叫做“正文”的专栏。我希望在这两个表的这两列中搜索相同的文本字符串,并返回适用的作业 例如,如果作业id=7的作业记录在其“摘要”列中有字符串“somestring”,而讨论记录有外键作业id=20和字符串“somestring”,我希望返回作业id=7和作业id=20的作业记录 我用的是拉威尔。我很难找到解决方案,这是我得到的最接近的解决方案:Php Laravel-跨两个表使用where连接,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有表“jobs”,按job\u id索引,还有外键为“job\u id”的表讨论 在工作中,我有一个叫做“总结”的专栏,在讨论中,我有一个叫做“正文”的专栏。我希望在这两个表的这两列中搜索相同的文本字符串,并返回适用的作业 例如,如果作业id=7的作业记录在其“摘要”列中有字符串“somestring”,而讨论记录有外键作业id=20和字符串“somestring”,我希望返回作业id=7和作业id=20的作业记录 我用的是拉威尔。我很难找到解决方案,这是我得到的最接近的解决方案: $quer
$query->join('discussions', function( $join ) use ( $search_term ){
$join->on('jobs.job_id', '=', 'discussions.job_id');
$join->where('discussions.body', 'LIKE', $search_term );
$join->orWhere('jobs.summary', 'LIKE', $search_term );
})
但这只是返回我讨论桌上的所有内容。有人有什么建议吗
谢谢:)试试这个,看看结果如何;) 编辑:我将用正确的
DB::table('mytable')
替换$query
EDIT2:我错过了一个半列,更正了这有SQL问题。你所做的基本上是这样的:
SELECT * FROM jobs INNER JOIN discussions ON (...) jobs.summary LIKE search_term
没有WHERE
子句,而且(…)
这一部分并不重要(简化了一点),因为有或,所以事实上您不(不仅)在键/fk对上加入表
您只需将那些中的移出join闭包,它将按预期工作:
$query->join('discussions', function( $join ) {
$join->on('jobs.job_id', '=', 'discussions.job_id');
})
->where('discussions.body', 'LIKE', $search_term )
->orWhere('jobs.summary', 'LIKE', $search_term )
->get();
现在,您的查询看起来应该是:
SELECT * FROM jobs INNER JOIN discussions ON jobs.id = discussions.job_id
WHERE discussions.body LIKE search_term
OR jobs.summary LIKE search_term
然后您必须更具体地使用select子句@ste771,谢谢您的解释。我遵循了您上面所说的内容,尽管查询确实如您所说呈现,但我仍然只从我的讨论表中返回结果。正在忽略jobs.summary中包含文本的作业。查询肯定是可以的,但是您可能需要leftJoin
而不是(内部)join
?干杯,leftJoin已经完成了操作,因为我现在得到了正确的结果:)非常感谢。但是,it job_id字段现在在从jobs表返回的结果中为空。你知道为什么会发生这种情况吗?你知道内部连接
和左连接
之间的区别吗?您将从“left”表中获得所有匹配结果(也包括那些没有相关作业的结果,因此对于其中一些作业,job\u id
可能为空)。我会详细查的。谢谢你花时间来处理这件事。Will将标记为已接受的答案,因为尽管我没有得到我想要的,但我明白我得到了什么以及为什么:)
$query->join('discussions', function( $join ) {
$join->on('jobs.job_id', '=', 'discussions.job_id');
})
->where('discussions.body', 'LIKE', $search_term )
->orWhere('jobs.summary', 'LIKE', $search_term )
->get();
SELECT * FROM jobs INNER JOIN discussions ON jobs.id = discussions.job_id
WHERE discussions.body LIKE search_term
OR jobs.summary LIKE search_term