天道酬勤,学无止境

Yii2 合并查询,如 yii1 中的 cdbcriteria(Yii2 merge queries like cdbcriteria in yii1)

问题

我有关于合并多个查询的问题。 在 Yii 1.x 中,您可以将 CDbCriteria 与

$criteria->merge($otherCriteria)

如何使用 Yii2 中的查询实现相同的嵌套条件等?

编辑:假设我想要单独的查询来形成子查询。 在完成所有子查询之后,我想将它们合并到一个大查询中。

回答1

Yii2不再有CDbCriteria概念。 相反,您可以参考以下类:

  • http://www.yiiframework.com/doc-2.0/yii-db-query.html ( yii\db\Query )
  • http://www.yiiframework.com/doc-2.0/yii-db-activequery.html ( yii\db\ActiveQuery )

您之前使用CDbCriteria所做的CDbCriteria现在您都可以使用上述类来完成。 因此,无需将两个标准相互合并。

更新

Yii2还支持如下子查询(作为Yii2的官方指南):

$subQuery = (new Query)->select('COUNT(*)')->from('user');
$query = (new Query)->select(['id', 'count' => $subQuery])->from('post');

结果是:

SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`

http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html#building-query

回答2

我最近也遇到了这个问题。 不存在完全融合的查询(选择、连接等)(据我所知)。 但是您可以手动合并条件,例如:

    $query1 = \app\models\User::find()
        ->where(['column1' => 'value1', 'column2' => 'value2']);

    $query2 = \app\models\User::find()
        ->where(['and', '[[column3]] = :column3', '[[column4]] = :column4'])
        ->addParams([
            ':column3' => 'value3',
            ':column4' => 'value4'
        ]);

    // merge conditions
    $query1->orWhere($query2->where);
    $query1->addParams($query2->params);

    // build SQL
    echo $query1->createCommand()->rawSql;

内置 SQL:

SELECT * FROM `yii2_user` WHERE 
    ((`column1`='value1') AND (`column2`='value2')) OR 
    ((`column3` = 'value3') AND (`column4` = 'value4'))
回答3

除了上面的两个优秀答案之外,如果您需要合并两个条件以发送到一个采用与where()格式相同的“条件”参数的方法,那么您可以构建自己的数组:

$condition1 = ['column1' => 'value1', 'column2' => 'value2'];
$condition2 = ['column3' => 'value3', 'column4' => 'value4'];
$condition = [
    'or',
    $condition1,
    $condition2,
];
$model->updateAll([ 'column5' => 'value5' ], $condition);

或者,如果感觉更合乎逻辑,您可以使用临时查询对象来构建条件并合并等。然后从中传递生成的 where 条件,例如:

$query1 = new \yii\db\Query;
$query1->andWhere(['column1' => 'value1', 'column2' => 'value2']);
$query2 = new \yii\db\Query;
$query2->andWhere(['column3' => 'value3', 'column4' => 'value4']);
$query = new \yii\db\Query;
$query->where($query1->where)
      ->orWhere($query2->where);

$model->updateAll([ 'column5' => 'value5' ], $query->where);

显然,当查询或条件在代码中的其他地方构建并单独传递到执行模型方法的地方时,这更有意义。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Yii2 merge queries like cdbcriteria in yii1
    I have a problem regarding merge of multiple queries. In Yii 1.x you could merge a CDbCriteria with $criteria->merge($otherCriteria) How can I achieve the same nested conditions etc with queries in Yii2? Edit: Let's say I want separate queries to form subqueries. And after all subqueries are done I want to merge them together to the one big query.
  • Yii2:ActiveQuery“ with”不起作用(Yii2: ActiveQuery “with” not working)
    问题 情况 我有三个与1:n相关的模型/数据库表:一个order有多个commissions ,一个佣金有多个commission_positions 。 因此,佣金位置具有包含佣金ID的FK字段。 佣金本身有一个包含订单ID的FK字段。 订单>佣金>佣金位置 问题 我现在需要做的是在相关的订单模型中选择具有特定值的所有CommissionPosition。 明显的解决方案是使用我通过命名范围扩展的CommissionPosition的查询对象。 命名范围如下所示: class CommissionPositionQuery extends ActiveQuery { /** * Named scope to filter positions of a certain alpha order id * @param integer $id the alpha order id * @return \common\models\query\CommissionPositionQuery */ public function alphaOrderId($id) { //TODO: with not working $this->with(['commission.order']); $this->andWhere(['alpha_order_id'=>$id]); return
  • 如何在yii2中计数和分组(How to count and group by in yii2)
    问题 我想使用 yii2 生成以下查询: SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id 我试过了: $leadsCount = Lead::find() ->where('approved = 1') ->groupBy(['promoter_location_id', 'lead_type_id']) ->count(); 生成此查询: SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c` 在 yii 1.x 中,我会执行以下操作: $criteria = new CDbCriteria(); $criteria->select = 'COUNT(*) AS cnt'; $criteria->group = array('promoter_location_id', 'lead_type_id'); 谢谢! 回答1 解决方案: $leadsCount = Lead::find() ->select(['COUNT(*) AS cnt']) ->where(
  • Yii2 step-by-step guide on login from table in MySQL
    I'm begining to make the first steps in Yii2. So far, I was able to write an application and connect a table in a database to it, just like I learned to do in Yii1. The table is contacts and the form in my create view sends the data to the database with no problems. The problem is that I only can login using Admin/Admin or demo/demo in the static user model that comes built-in in Yii2. In Yii1.xx i manage to validate login from a table in database using COMPONENTS/useridentity, just like this (I used a table named utilizador, with fields id, utilizador and password): class UserIdentity extends
  • 使用CamelCase动作名称时的Yii2路由(Yii2 routing when using CamelCase action names)
    问题 如果您说以下控制器结构 <?php namespace app\controllers; use Yii; use yii\web\Controller; /** * Test controller */ class TestController extends Controller { public function actionMyaction(){ ... //action logic } public function actionMyAction(){ ... //action logic } } 可以使用example.com/test/myaction路径访问第一条路线 每个Yii 1.x逻辑的第二条路由应可从路径Yii2.x中的example.com/test/myAction访问,路由使用的是带连字符的结构,并且只能从example.com/test/my-action访问 无论如何,是否有必要在Yii2中使用camelCase结构启用路由,最好不使用路由类进行扩展? 这很重要,因为它破坏了所有链接(当然是整个Internet上)的向后兼容性,因此,即使代码被完全重写,Yii1.x应用程序也永远无法迁移到Yii2.x。 发生此更改的原因是什么? 回答1 我也对这项更改有所关注,但最终我发现它使URL更易于阅读。 我不确定在Yii1中是否有区分大小写的路由
  • Yii2:如何用联合查询和排序创建ActiveDataProvider?(Yii2: How to create ActiveDataProvider with union query and sorting?)
    问题 使用Yii Framework 2.0,我有两个数据库表,如下所示。 A table: a_id = 1, name = yes, number = 123 a_id = 2, name = no, number = 456 a_id = 3, name = ok, number = 683 B table: id = 1, a_id = 1, firstname = s id = 2, a_id = 1, firstname = y id = 3, a_id = 2, firstname = e id = 4, a_id = 2, firstname = x id = 5, a_id = 2, firstname = t id = 6, a_id = 3, firstname = r 我想使用ActiveDataProvider for GridView查询这些记录,并得到如下结果。 a_id = 1, name = yes, number = 123 a_id = 1, name = s, number = null a_id = 1, name = y, number = null a_id = 2, name = no, number = 456 a_id = 2, name = e, number = null a_id = 2, name = x, number
  • 依赖下拉菜单yii2。 怎么做?(dependent dropdown yii2. How to do?)
    问题 如何在yii2中创建依赖项下拉列表? 我有两个表: 'id','name_country" 'id','name_city','country_id' 在我的模型中有两种方法: public function getCountryList() { $models = NetCountry::find()->asArray()->all(); return ArrayHelper::map($models, 'id', 'country_name'); } 和 public function getCityList($parent_id) { $models = \common\models\City::find()->where(['parent_id' => $country_id])->asArray()->all(); return ArrayHelper::map($models, 'id', 'name_city','country_id'); } 我有第一个领域: <?= $form->field($model, 'country')->dropDownList($model->countryList),['id'=>'parent_id']; 第二个 <?= $form->field($model, 'city')->dropDownList($model-
  • 在 Yii2 中的视图中更改布局文件(Change layout file within a view in Yii2)
    问题 我正在使用 Yii2 做一个小项目。 假设我在视图(例如site )中具有相同的布局(页眉、页脚),但该视图中的login.php除外。 我想要这个文件中有一个不同的或没有页眉/页脚。 我该怎么做才能仅从此视图文件中删除页眉/页脚。 我所能做的就是在不同的视图中更改布局。 是否可以在视图的单个文件中更改布局? 回答1 在相对动作中: public function actionYourAction($id) { $this->layout = 'yourNewLayout'; return $this->render('yourView', [ 'model' =>$model, ]); } 回答2 我有点迟到了,但您可以从您的视图中改变你的布局。 您不必在控制器中声明它。 我个人认为最好在视图中进行,因为稍后您可以轻松看到正在发生的事情。 如果您进行 HTML 编辑,您将进入视图文件,并且很容易就能看到它正在使用哪种布局。 将它放在控制器中,您(或稍后的某个人)可能会错过嵌套在控制器操作中的布局更改。 由于$this指的是 Yii2 中的视图,而不是 Yii1 中的控制器,因此旧的$this->layout在您的视图中不再起作用。 现在,在 Yii2 中,您可以使用$this->context从您的视图中引用控制器。 $this->context->layout =
  • How to count and group by in yii2
    I would like to generate following query using yii2: SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id I have tried: $leadsCount = Lead::find() ->where('approved = 1') ->groupBy(['promoter_location_id', 'lead_type_id']) ->count(); Which generates this query: SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c` In yii 1.x I would've done the following: $criteria = new CDbCriteria(); $criteria->select = 'COUNT(*) AS cnt'; $criteria->group = array('promoter_location_id', 'lead_type_id')
  • Yii2 REST查询(Yii2 REST query)
    问题 HY。 我有一个ProductController,它扩展了yii \ rest \ ActiveController。 问题是我如何通过HTTP GET请求进行查询。 像:http://api.test.loc/v1/products/search?name = iphone 返回对象将包含所有名称为iphone的产品。 回答1 更新:2016年4月29日 这是比上一次更新中介绍的方法更简单的一种方法。 它总是涉及到由gii生成的Search类。 我喜欢用它在一个地方定义和维护所有与搜索相关的逻辑,例如使用自定义方案,处理验证或在过滤过程中涉及相关模型(如本例所示)。 所以我要回到我的第一个答案: public function actions() { $actions = parent::actions(); $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider']; return $actions; } public function prepareDataProvider() { $searchModel = new \app\models\ProductSearch(); return $searchModel->search(\Yii::$app->request-
  • 如何将 count(*) 和 group by 查询转换为 yii 并从中获取数据(how to convert count(*) and group by queries to yii and fetch data from it)
    问题 我想在 yii 中转换这个查询 SELECT count(*) AS cnt, date(dt) FROM tbl_log where status=2 GROUP BY date(dt) 并从中获取数据。 我试试这个命令( dt是日期时间字段): $criteria = new CDbCriteria(); $criteria->select = 'count(*) as cnt, date(dt)'; $criteria->group = 'date(dt)'; $criteria->condition = 'status= 2'; $visit_per_day = $this->findAll($criteria); 但不会获取任何数据! 我该怎么做才能获取数据? 回答1 可能您看不到数据,因为您需要将数据分配给不存在的模型属性。 $criteria = new CDbCriteria(); $criteria->select = 'count(*) AS cnt, date(dt) AS dateVar'; $criteria->group = 'date(dt)'; $criteria->condition = 'status= 2'; $visit_per_day = $this->findAll($criteria); 这意味着您的模型必须具有属性 cnt 和
  • Active Record中的Yii2子查询(Yii2 subquery in Active Record)
    问题 如何将此sql转换为活动记录查询 SELECT * FROM `base_twitter` WHERE id NOT IN (SELECT base_id from base_followers) 回答1 假设您的模型分别命名为BaseTwitter和BaseFollower ,这应该可以工作: $subQuery = BaseFollower::find()->select('id'); $query = BaseTwitter::find()->where(['not in', 'id', $subQuery]); $models = $query->all(); 回答2 // SELECT * FROM (SELECT * FROM `user` WHERE `active` = 1) `activeusers`; $subquery = (new \yii\db\Query)->from('user')->where(['active' => true]) $query = (new \yii\db\Query)->from(['activeusers' => $subquery]); // subquery can also be a string with plain SQL wrapped in parenthesis // SELECT * FROM
  • Yii2 Gii Table Prefix
    I allways setup table prefix - for this post lets say my prefix is abc_. So in common\config\main-local.php. I have: 'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=database', 'username' => 'user', 'password' => 'pwd', 'charset' => 'utf8', 'tablePrefix' => 'abc_', ], ... I have worked on Yii1 and used gii to generate models. In this version it generated files like: table.php. Now I work with Yii2 and learn the differences: gii generate files like abc_table.php. Yes - I checked "Use Table Prefix". This is not ok because prefix should be
  • yii2. 向模型动态添加属性和规则(Yii2. Adding attribute and rule dynamically to model)
    问题 我正在编写一个小部件,我想避免用户向他们的模型添加代码(我知道这会更容易,但使用它来学习新东西)。 您是否知道是否可以向模型添加属性(不在您的数据库中,因此它将是虚拟的)并为该属性添加规则?。 您无权更改该型号代码。 我知道规则是一个数组。 过去,我使用 array_merge 合并了来自父类的规则。 可以在外部完成吗? Yii2 有这样的方法吗? 一个想法是在我的小部件中使用“模型”扩展用户提供的模型并使用: public function init() { /*Since it is extended this not even would be necessary, I could declare the attribute as usual*/ $attribute = "categories"; $this->{$attribute} = null; //To create attribute on the fly parent::init(); } public function rules() { $rules = [...]; //Then here merge parent rules with mine. return array_merge(parent::rules, $rules); } 但是如果我扩展它,当我在 ActiveForm
  • Yii2:使用查询构建器更新字段(Yii2: update field with query builder)
    问题 如何使用 Yii2 中的查询构建器更新字段? 我在文档中找不到这个。 谢谢! UPD 这是解决方案: // UPDATE $connection = Yii::$app->db; $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); 回答1 查询构建器仅适用于选择查询(总和、最大值、计数)。 您应该使用其他方法 - AR 或原始查询(https://github.com/yiisoft/yii2/blob/master/docs/guide/db-dao.md#basic-sql-queries) 回答2 可以直接使用create命令,如下: \Yii::$app->db->createCommand("UPDATE table SET column1=:column1, column2=:column2 WHERE id=:id") ->bindValue(':id', your_id) ->bindValue(':column1', :column1_value) ->bindValue(':column2', :column2_value) ->execute(); 回答3 试试这样, Yii::$app->db->createCommand() -
  • Yii2如何执行“与”或“或”条件分组?(Yii2 How to perform where AND or OR condition grouping?)
    问题 我是Yii-2框架的新手。 我如何使用activeQuery和模型在Yii-2框架中实现以下查询。 SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1) 谢谢 回答1 您可以尝试以下方法: //SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1) $model = arname()->find() ->andWhere(['user_id'=>[1,5,8]]) ->andWhere(['or', ['status'=>1], ['verified'=>1] ]) ->orWhere(['and', ['social_account'=>1], ['enable_social'=>1] ]) ->all(); 回答2 试试这个 - $query = (new \yii\db\Query()) ->select('*') ->from(
  • Yii2 routing when using CamelCase action names
    If you have say the following controller structure <?php namespace app\controllers; use Yii; use yii\web\Controller; /** * Test controller */ class TestController extends Controller { public function actionMyaction(){ ... //action logic } public function actionMyAction(){ ... //action logic } } The first route can be accessed using the path example.com/test/myaction The second route per Yii 1.x logic should be accessible from the path example.com/test/myAction in Yii2.x routing is using hyphenated structure and is accessible only from example.com/test/my-action Is there anyway to enable
  • dependent dropdown yii2. How to do?
    can I create a dependent dropdown in yii2? I have two tables: 'id','name_country" 'id','name_city','country_id' and have two methods in my model: public function getCountryList() { $models = NetCountry::find()->asArray()->all(); return ArrayHelper::map($models, 'id', 'country_name'); } and public function getCityList($parent_id) { $models = \common\models\City::find()->where(['parent_id' => $country_id])->asArray()->all(); return ArrayHelper::map($models, 'id', 'name_city','country_id'); } I have the first field: <?= $form->field($model, 'country')->dropDownList($model->countryList),['id'=>
  • Customise grid view in yii2
    How to remove summary and sorter for a particular grid view in Yii2. In Yii1.1 we can do that by setting the template property. In yii2 how to achieve this?
  • how to use required on insert validator for yii2?
    Can anyone have a suggestion about how to use "on" => "insert" validation in yii2? I have used array('field_name', 'required', 'on'=>'insert') in Yii1 but in yii2 it does not check if I set ['field_name', 'required', 'on'=>'insert'] . What is the problem here can you please explain? Thanks in advance.