postgre如何在Yii2中使用queryBuilder构建我的sql查询



我的解决方案:

$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%'

SQLconcat()连接字符串。

您应该使用':term'来提供字符串。

尝试使用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  yiidbActiveRecord
{
public $lable;
/**
* @inheritdoc
*/
public function rules()
{
return [
....

因此,如果您想使用查询生成器,它应该是:

$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属性添加到UsersActiveRecord类的回答。由于模式检查,所有表列值都可以通过魔术方法获得。未在架构中显示但在查询结果中声明的密钥名称,应在目标ActiveRecord类中定义为公共属性或私有/受set<KeyName>()方法保护。

另一种方法是在不创建对象的情况下使用查询的数组结果。它通过在->all()方法执行之前将->asArray()添加到调用链来达到目的。

相关内容

  • 没有找到相关文章

最新更新