如何在Yii2中使用queryBuilder创建SQL查询?

4bbkushb  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(142)

我的解决方案:

$author_id = 25;
$sql = "SELECT DISTINCT author_id AS label
          FROM users
         WHERE author_id ::text LIKE '%:term%' AND role = 'Editor'";
$query = Users::findbysql($sql, [ ':term' => $author_id ] )->all();

问题出在标签别名上,然后标签别名失败,并显示:author_id ::text LIKE '%:term%'

cygmwpex

cygmwpex1#

SQL concat()连接字符串。
您应该使用':term'来提供字串。

bvjxkvbb

bvjxkvbb2#

尝试使用concat管理类似字符串的参数

$author_id = 25;
    $sql = "SELECT DISTINCT author_id AS label
              FROM users
             WHERE author_id ::text LIKE concat('%', :term,'%') AND role = 'Editor'";
    $query = Users::findbysql($sql, [ ':term' => $author_id ] )->all();

如果模型中没有字段label,则在用户类中添加pubblic var $label

class Users extends  \yii\db\ActiveRecord
    {

        public $lable;

        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
            ....
6ju8rftf

6ju8rftf3#

因此,如果要使用查询构建器,它应该像这样:

$author_id = 25;
$users = Users::find()
    ->select(['label' => 'author_id'])
    ->distinct()
    ->andWhere(['ilike', new Expression('"author_id"::text'), $author_id])
    ->andWhere(['role' => 'Editor'])
    ->all();

请注意@ScaisEdge关于将label属性添加到Users ActiveRecord类的回答。由于模式检查,所有表列值都可以通过神奇方法获得。模式中没有出现但在查询结果中声明的键名,您应该在目标ActiveRecord类中使用set<KeyName>()方法将其定义为公共属性或私有/受保护属性。
另一种方法是使用查询的数组结果而不创建对象。它通过在->all()方法执行之前将->asArray()添加到调用链中来实现。

相关问题