我正在使用CodeIgniter 4编程,我正在使用CodeIgniter的模型,因为我理解使用它是一个很好的实践。这是使用一个非常简单的表进行查询的好方法:
$this->myModel
->select('field')
->where('user_id', 1)
->findAll()
我甚至不需要写表名
然而,我不能做子查询,特别是,我需要从另一个表中读取user_id
:
$this->myModel
->select('field')
->whereIn('user_id', SUBQUERY)
->findAll()
SUBQUERY isselect('id') from users where status='active'
.
但是,这行不通:
$this->myModel
->select('field')
->whereIn('user_id', $this->userModel->select('id)->where('status', 'active')->findAll() )
->findAll()
是否有一种方法可以用CodeIgniter的模型来做,或者最好的方法是什么?我应该用查询生成器做子查询并将其与模型的使用混合吗?
谢谢!
代替:❌
->whereIn('user_id', $this->userModel->select('id')->where('status', 'active')->findAll() )
使用这个:✅
// Get User table.
$userTable = $this->userModel->getTable();
// ...
->whereIn('user_id',
static fn(CodeIgniterDatabaseBaseBuilder $builder) use ($userTable) => $builder->select('id')
->from($userTable)
->where('status', 'active')
)
$builder->whereIn()
在(' item ', ' item ') SQL查询中用AND连接生成一个WHERE字段如果合适:
你可以使用子查询代替数组的值:
附录
在您的特殊情况下,您可以选择使用$builder->join()
允许您编写查询的
JOIN
部分:
即:
$userTable = $this->userModel->getTable();
$myTable = $this->myModel->getTable();
$this->myModel
->select(["$myTable.field"])
->join($userTable, "$myTable.user_id = $userTable.id")
->where("$userTable.status", "active")
->get()->getResult();