【问题标题】:Laravel LeftJoin whereLaravel LeftJoin where
【发布时间】:2014-12-29 22:50:30
【问题描述】:

我的 eloquent 模型存在一些问题,我尝试将两个不同的表合并为一个

现在我有两张类似的桌子。

第一个表名“company_saved_cv”

|id|company_id|worker_id |
--------------------------
|1|       2    |  61     |
|3|       3    |  66     |
|4|       2    |  69     |
--------------------------

第二个表名为“workers”

|id|location|name_and_surname|
------------------------------
|61|London  | John John      |
|62|London  | John John      |
|66|London  | John John      |
|67|London  | John John      |
|68|London  | John john      |

我想得到这样的桌子。

|id|location|name_and_surname|worker_id|
---------------------------------------|
|61|London  | John John      |  61     |
|62|London  | John John      | NULL    |
|66|London  | John John      | 66      |
|67|London  | John John      | NULL    |
|68|London  | John john      | NULL    |

我的模型函数在哪里

public static  function CvSearch($interested_field, $location)
{

    $match = "MATCH( `interested_fields`) AGAINST (?)";

    $query = Worker::select('workers.name_and_surname', 'workers.id', 'workers.location','company_saved_cv.worker_id')
        ->leftJoin('company_saved_cv', function($leftJoin)
        {
            $leftJoin->on('company_saved_cv.worker_id', '=', 'workers.id')
                ->where('company_saved_cv.company_id', '=', Session::get('company_id') );


        })
        ->where('workers.location', '=', $location)
        ->whereRaw($match, array($interested_field))
        ->orderBy('workers.created_at')
        ->paginate(10);
    return $query;
}

如果我评论这一行:->where('company_saved_cv.company_id', '=', Session::get('company_id') ); 它正在工作,但我只需要从workers 表中获得company_id = 2 的行(在我的示例中);

Session::get('company_id') = 2 

我会通过将它记录到 laravel.log 文件中来检查它。

我认为问题在于 where('company_saved_cv.company_id', '=', Session::get('company_id') );请求,但我无法弄清楚,也许有人可以帮助我?

【问题讨论】:

  • 实现结果的逻辑是什么。因为我看不到任何类型的关系 b/w 你的桌子。
  • 闻起来像 XY 问题

标签: php mysql sql laravel


【解决方案1】:

我用这段代码解决了这个问题

 $query = Worker::select('workers.name_and_surname', 'workers.id', 'workers.location','company_saved_cv.worker_id')
        ->leftJoin('company_saved_cv', function($leftJoin)use($company_id)
        {
            $leftJoin->on('workers.id', '=', 'company_saved_cv.worker_id');
            $leftJoin->on(DB::raw('company_saved_cv.company_id'), DB::raw('='),DB::raw("'".$company_id."'"));


        })

【讨论】:

  • 您不需要在第二个参数 (=) 上使用 DB::raw
  • 你也不需要在第一个参数上使用它。
  • 你也应该将$company_id 转换为一个整数,以确保你是安全的注射和那种讨厌的东西。 DB::raw("'" . (int) $company_id . "'")
  • 谢谢,当你想用where子句加入join时非常有用。
【解决方案2】:

当您使用 LEFT JOIN 时,它充当 INNER JOIN

使用 LEFT JOIN 和 WHERE 类似

SELECT workers.name_and_surname, workers.id, workers.location,company_saved_cv.worker_id
FROM workers LEFT JOIN company_saved_cv
ON company_saved_cv.worker_id= workers.id
WHERE company_saved_cv.company_id = 2

输出

|id|location|name_and_surname|worker_id|
---------------------------------------|
|61|London  | John John      |  61     |
|66|London  | John John      |  66     |

使用 LEFT JOIN 和 AND 类似

SELECT workers.name_and_surname, workers.id, workers.location,company_saved_cv.worker_id
FROM workers LEFT JOIN company_saved_cv
ON company_saved_cv.worker_id= workers.id
AND company_saved_cv.company_id = 2

输出

|id|location|name_and_surname|worker_id|
---------------------------------------|
|61|London  | John John      |  61     |
|62|London  | John John      | NULL    |
|66|London  | John John      | 66      |
|67|London  | John John      | NULL    |
|68|London  | John john      | NULL    |

新查询

$query = Worker::select('workers.name_and_surname', 'workers.id', 'workers.location','company_saved_cv.worker_id')
        ->leftJoin('company_saved_cv', function($leftJoin)
        {
            $leftJoin->on('company_saved_cv.worker_id', '=', 'workers.id')

                ->on('company_saved_cv.company_id', '=', Session::get('company_id') );


        })

【讨论】:

  • @lggg3:应该有帮助。
  • 我收到错误调用未定义方法 Illuminate\Database\Query\JoinClause::and()
  • 语法有点问题,现在检查一下。
  • 我已经试过了,还是不行,我把正确答案写下来了
【解决方案3】:

差不多是这样的:

$directoryTypeId = 1;

Node::query()
    ->leftJoin('directories', 'directories.id', '=', 'nodes.directory_id')
    ->leftJoin('directory_types', function ($leftJoin) use ($directoryTypeId) {
        $leftJoin
            ->on('directory_types.id', '=', DB::raw($directoryTypeId))
            ->on('directory_types.COLUMN_1', '=', 'directories.COLUMN_2');
    })
    ->select([
        'nodes.id as node_id',
        'directories.name',
        'directory_types.id as type_id',
    ]);

【讨论】:

    【解决方案4】:

    您可以轻松地使用模型。最后一个表,您可以删除该位置,因为您可以从模型中获取它。轻松创建多对多关系或您想要的东西。查看文档:http://laravel.com/docs/4.2/eloquent#relationships

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2020-08-01
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多