如何使用和不使用模型在Yii2中编写数据库/ SQL查询

时间:2016-04-14 15:59:37

标签: sql yii2

我有一个包含多列的表,我想使用另一个列名作为搜索条件返回列名。我如何在yii2中实现这一目标?

下面是示例代码,正常的sql应该是:

$name = SELECT type_name FROM ProductTable WHERE type_id = 1;
echo $name;

这应该返回列type_name的值,其中列type_id的值等于1.我试过了,但它没有工作

$type_name = ProductTable::find()->where(['type_id' =>$model->type_id]);

$type_name = Product::find(['type_name'])->where(['type_id' =>$model->type_id]);

我也试过这个,但我猜错了

我希望我的问题很清楚,任何帮助都会让他赞赏

4 个答案:

答案 0 :(得分:1)

有关Yii2的ActiveRecord的一般介绍,请参阅指南:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

如果您想要完整的行并拥有模型,那么您只是错过one()

Product::find()->where(['type_id' =>$model->type_id])->one();

如果您确实定义了模型并且只想要一个值,请尝试:

Product::find()->select('type_name')->where(['type_id' =>$model->type_id])->scalar();

它基本上通过模型生成ActiveQuery,并将其更改为仅返回匹配结果的第一行中的第一列。

如果您没有模型,您还可以生成没有ActiveRecord使用的普通查询(http://www.yiiframework.com/doc-2.0/yii-db-query.html

$name = (new Query())->select('type_name')
    ->from('ProductTable')
    ->where(['type_id' =>$model->type_id])
    ->scalar();

答案 1 :(得分:1)

我假设您使用Gii模块生成了ProductTable。

另外,如果type_id列是主键:

$product = ProductTable::findOne($model->type_id);
if($product !== null) { $product->typeName /*... read value ...*/}

或获取所有记录

$products = ProductTable::findAll($model->type_id); //match all records.

对于任何其他列,请改用以下语法:

$product = ProductTable::findOne(['type_id' => $model->type_id]);

答案 2 :(得分:1)

你也可以使用createCommand!

$name = \Yii::$app->getDb()->createCommand("SELECT type_name FROM ProductTable WHERE type_id=:typeId", ['typeId'=>$model->type_id])->queryAll();

答案 3 :(得分:0)

使用以下代码获取type_name

 $PTable=ProductTable::find()->select('type_name')->where(['type_id' =>$model->type_id])->one();
    echo $PTable->type_name;