使用嵌套where条件的PHP Yii2 ActiveRecord
我想使用model::find()->创建一个activeQuery,其中。。。 这将生成如下所示的sql(不管逻辑如何)。 没有连接,只是单个表的许多where条件。我想这应该很简单,我只是错过了一些地方。使用嵌套where条件的PHP Yii2 ActiveRecord,php,activerecord,yii2,Php,Activerecord,Yii2,我想使用model::find()->创建一个activeQuery,其中。。。 这将生成如下所示的sql(不管逻辑如何)。 没有连接,只是单个表的许多where条件。我想这应该很简单,我只是错过了一些地方。 我不知道如何创建这样的嵌套where条件。有什么提示吗 select * from article where ( (site="domain.com" AND service="electronics" AND source="reader" AND tag like "%" A
我不知道如何创建这样的嵌套where条件。有什么提示吗
select * from article where
(
(site="domain.com" AND service="electronics" AND source="reader" AND tag like "%" AND marker like "%" )
OR
(site="domain.net" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
)
AND NOT
(
(site="domain.com" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
OR
(site="domain.us" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
)
最简单的方法是使用
findBySql
这边
$myQuery = 'select * from article where
(
(site="domain.com" AND service="electronics" AND source="reader" AND tag like "%" AND marker like "%" )
OR
(site="domain.net" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
)
AND NOT
(
(site="domain.com" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
OR
(site="domain.us" AND service="electronics" AND source like "%" AND tag like "%" AND marker like "%" )
)';
$model = Article::findBySql($myQuery)->all();
$dataProvider = new ActiveDataProvider([
'query' => Article::findBySql($myQuery)->all(),
'pagination' => [
'pageSize' => 10,
],
'sort' => [
........
],
]);
否则,如果您需要活动数据提供程序,可以这样做
$dataProvider = new ActiveDataProvider([
'query' => Article::findBySql($myQuery)->all(),
'pagination' => [
'pageSize' => 10,
],
'sort' => [
........
],
]);
好的,我找到答案了。我使用Model::find()->where()并构建了嵌套数组。这样我就可以使用ActiveRecord和所有gridview/dataprovider功能 您可以尝试使用“and”和“and”或“or”运算符嵌套它:
['and', 'type=1',
['or', 'id=1', 'id=2']
]
将生成type=1和(id=1或id=2)
更多信息:
但如果我这样做,我就不能使用dataprovider和gridview。使用findBySql时,GridView将不可搜索/排序。目前我正在使用findBySql,但是如果我可以使用AR,它将对我有很大帮助。使用myQuery作为查询的值,您可以做您需要的事情(dataProvider)。我已经更新了应答器,但它无法工作,因为对于gridview,我需要SearchModel,并且在使用findBySql()时,“注意,因为SQL语句已经指定,所以在创建的查询上调用其他查询修改方法(例如where(),order())”—注意,因为SQL语句已经指定,在创建的..上调用其他查询修改方法(如where()、order())。。“我无法更好地理解解释。在DataProvider中设置您喜欢的查询。在search中也可以这样做。(是另一个DataProvider)在任何情况下,您都可以使用这种查询。如果您所显示的查询是您所需要的,那么您可以在所有需要的方法中使用findBySql,但在GridView中,我需要使用filterModel进行搜索,除非我开始编写大量SQL,否则我猜它不会工作,因为它必须在此处添加->和FilterWhere(如果你看一看gii生成的任何示例)和->和过滤器这里不能使用findBySql。我的问题是如何在AR中创建这样的查询,或者知道这是否不可能,不要使用findBySql,因为这有点不同。