我的解决方案:
$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
属性添加到Users
ActiveRecord类的回答。由于模式检查,所有表列值都可以通过魔术方法获得。未在架构中显示但在查询结果中声明的密钥名称,应在目标ActiveRecord类中定义为公共属性或私有/受set<KeyName>()
方法保护。
另一种方法是在不创建对象的情况下使用查询的数组结果。它通过在->all()
方法执行之前将->asArray()
添加到调用链来达到目的。