Laravel - 使用两个表之间的连接

时间:2014-06-18 12:35:56

标签: php mysql laravel eloquent

我有表,'jobs',由job_id索引,以及与外键'job_id'的表讨论。

在工作中我有一个名为'summary'的专栏,在讨论中有一个名为'body'的专栏。我想在这两个表中的两个列中搜索相同的文本字符串,并返回适用的作业。

例如,如果job_id = 7的作业记录在其'summary'列中有字符串'somestring',并且讨论记录有外键job_id = 20并且字符串'somestring',我想要job_id的作业记录= 7并且job_id = 20返回。

我正在使用laravel。我找不到解决方案,这是我最接近的解决方案:

$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 );                                  
            })

但这只会从我的讨论表中返回所有内容。有没有人有任何建议?

谢谢:)

2 个答案:

答案 0 :(得分:1)

有SQL的问题。你在做什么基本上是这样的:

SELECT * FROM jobs INNER JOIN discussions ON (...) jobs.summary LIKE search_term

没有WHERE条款,而(...)部分因为有OR而无关紧要(简化了一点),所以事实上你不会(不仅)将表加入key / fk对。

您只需要将这些where移出连接闭包,它将按预期工作:

$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

答案 1 :(得分:0)

试试这个并看看它是什么;)

$query->join('discussions', function( $join ) use ( $search_term ){
                $join->on('jobs.job_id', '=', 'discussions.job_id')
                 ->where('discussions.body', 'LIKE', $search_term )                    
                 ->orWhere('jobs.summary', 'LIKE', $search_term );                               
            })
      ->select('*')
      ->get();

编辑:我会将$query替换为正确的DB::table('mytable')

DB::table('jobs')->join('discussions', function( $join ) use ( $search_term ){
                $join->on('jobs.job_id', '=', 'discussions.job_id')
                 ->where('discussions.body', 'LIKE', $search_term )                    
                 ->orWhere('jobs.summary', 'LIKE', $search_term );                               
            })
      ->select('*')
      ->get();

EDIT2:我错过了一个半圆,更正了