Laravel Eloquent ORM WHERE IN (子查询)

3

我有以下SQL查询:

SELECT * from db.tableA WHERE field in (SELECT id FROM db.tableB where other_field = value);

我想从tableA中选择字段,这些字段在子查询返回的值数组中。问题是:如何使用eloquent实现这一点?我的当前解决方案(我认为非常丑陋)如下:

$a = \App\tableB::where("other_field", "=", $value)->select('id')->get();
$arr = array();
for ($i = 0; $i < count($a); $i++) array_push($arr, $a[$i]['id']);
$res = \App\tableA::whereIn("field", $arr)->get();

有更好的方法吗?

谢谢!

2个回答

12

一条查询胜过两条查询!

因此,以下代码使用Eloquent在whereIn子句中执行一个带有子查询的查询:

\App\tableA::whereIn("field", function ($query) use ($value) {
    $query->select('id')
        ->from('table_b')
        ->where('other_field', $value);
})->get()

0

让我们简化你的代码。

$arr = \App\tableB::where("other_field", "=", $value)->lists('id')->all(); 

$res = \App\tableA::whereIn("field", $arr)->get();

lists()与all()链式调用将自动将您的集合转换为数组。但是在laravel 5.0或更低版本中,您不需要使用all()将集合转换为数组。


6
这并不是一个子查询,而是另外一个查询。当第一个查询返回的记录超过几千条或者一百万条时,你的应用程序会出现问题。以下是如何进行子查询的方法: https://dev59.com/oF8d5IYBdhLWcg3wNAGy - Okneloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接