使用嵌套where条件的PHP Yii2 ActiveRecord

使用嵌套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

我想使用model::find()->创建一个activeQuery,其中。。。 这将生成如下所示的sql(不管逻辑如何)。 没有连接,只是单个表的许多where条件。我想这应该很简单,我只是错过了一些地方。
我不知道如何创建这样的嵌套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,因为这有点不同。