Php Yii2从模型(RESTAPI)在控制器中使用方法
我用Yii2框架制作了一个简单的restapi。我制作了一个带有一些查询的控制器,用于从数据库中获取数据。但是现在我想把这些查询从控制器中分离出来。我认为我应该把函数放在模型(ActiveRecord)中获取查询,但是我不能从我的控制器访问该方法Php Yii2从模型(RESTAPI)在控制器中使用方法,php,api,rest,model,yii2,Php,Api,Rest,Model,Yii2,我用Yii2框架制作了一个简单的restapi。我制作了一个带有一些查询的控制器,用于从数据库中获取数据。但是现在我想把这些查询从控制器中分离出来。我认为我应该把函数放在模型(ActiveRecord)中获取查询,但是我不能从我的控制器访问该方法 namespace app\models; use yii\db\ActiveRecord; class Car extends ActiveRecord { public function __construct(){ p
namespace app\models;
use yii\db\ActiveRecord;
class Car extends ActiveRecord {
public function __construct(){
parent::__construct();
}
public static function tableName(){
return 'auto_new';
}
public static function primaryKey(){
return ['auto_id'];
}
// Regels voor POST callback
public function rules(){
//voorbeeld
/*
return [
[['username', 'password'], 'required']
];
*/
}
public static function getCar(){
$query = (new Query())
->select([
'a.auto_id auto_id',
'm.merk merk',
'a.model model',
'a.uitvoering uitvoering',
'k.kleur kleur',
't.transmissie transmissie',
'a.kmstand kmstand',
'a.bouwjaar bouwjaar',
'a.vermogen vermogen',
'b.brandstof brandstof',
'g.garantie garantie',
'a.prijs prijs',
'kl.postcode postcode',
'kl.woonplaats woonplaats',
'GROUP_CONCAT(DISTINCT(atn.NL)) opties',
'GROUP_CONCAT(DISTINCT(f.foto_id)) fotos'
])
->from('auto_new a')
->join('INNER JOIN', 'tbl_merken m', 'a.merk = m.merk_id') //Merk
->join('INNER JOIN', 'tbl_kleur k', 'a.kleur = k.kleur_id') //Kleur
->join('INNER JOIN', 'tbl_transmissie t', 'a.transmissie = t.transmissie_id') //Transmissie
->join('INNER JOIN', 'tbl_brandstof b', 'a.brandstof = b.brandstof_id') //Brandstof
->join('INNER JOIN', 'tbl_garantie g', 'a.garantie = g.garantie_id') //Garantie
->join('INNER JOIN', 'klanten kl', 'a.ac = kl.ac') //Klantgegevens
//Alle opties van de auto
->leftJoin('auto_accessoire acc', 'a.auto_id = acc.auto_id AND a.ac = acc.ac')
->leftJoin('tbl_accessoires_trader_new atn', 'acc.code_id = atn.code_id')
//Alle foto's van de auto
->leftJoin('auto_foto f', 'a.auto_id = f.auto_id AND a.ac = f.ac')
->groupBy('a.auto_id')
->all();
return $query;
}
}
这是我的控制器中的方法:
public function actionGetcarsbyac($ac) {
Yii::$app->response->format = Response::FORMAT_JSON;
$model = $this->modelClass;
$query = Car::getCar();
$query->where(['a.ac' => $ac]);
return $query;
}
当我尝试打开url时,会出现以下错误:
对非对象调用成员函数getUniqueId()
我不知道该怎么做,也不知道该把这些查询方法放在哪里。我认为这是因为当你把
->all()
或->one()
或任何其他方法放在一起时,它会给你填充的结果对象,你无法进一步查询
因此,当您想要进一步处理该查询时,您应该返回不带query方法的查询,然后在控制器操作中完成该查询。因此,通过这样做,您的代码将如下所示:
public static function getCar(){
$query = new Query();
$query->select([
'a.auto_id auto_id',
'm.merk merk',
'a.model model',
'a.uitvoering uitvoering',
'k.kleur kleur',
't.transmissie transmissie',
'a.kmstand kmstand',
'a.bouwjaar bouwjaar',
'a.vermogen vermogen',
'b.brandstof brandstof',
'g.garantie garantie',
'a.prijs prijs',
'kl.postcode postcode',
'kl.woonplaats woonplaats',
'GROUP_CONCAT(DISTINCT(atn.NL)) opties',
'GROUP_CONCAT(DISTINCT(f.foto_id)) fotos'
])
->from('auto_new a')
->join('INNER JOIN', 'tbl_merken m', 'a.merk = m.merk_id') //Merk
->join('INNER JOIN', 'tbl_kleur k', 'a.kleur = k.kleur_id') //Kleur
->join('INNER JOIN', 'tbl_transmissie t', 'a.transmissie = t.transmissie_id') //Transmissie
->join('INNER JOIN', 'tbl_brandstof b', 'a.brandstof = b.brandstof_id') //Brandstof
->join('INNER JOIN', 'tbl_garantie g', 'a.garantie = g.garantie_id') //Garantie
->join('INNER JOIN', 'klanten kl', 'a.ac = kl.ac') //Klantgegevens
//Alle opties van de auto
->leftJoin('auto_accessoire acc', 'a.auto_id = acc.auto_id AND a.ac = acc.ac')
->leftJoin('tbl_accessoires_trader_new atn', 'acc.code_id = atn.code_id')
//Alle foto's van de auto
->leftJoin('auto_foto f', 'a.auto_id = f.auto_id AND a.ac = f.ac')
->groupBy('a.auto_id')
return $query;
}
public function actionGetcarsbyac($ac) {
Yii::$app->response->format = Response::FORMAT_JSON;
$model = $this->modelClass;
$query = Car::getCar();
$query->where(['a.ac' => $ac])
->all(); // here you are completing your query
return $query;
}
请注意,我已经从getCar()
中删除了->all()
。现在你的行动是:
public static function getCar(){
$query = new Query();
$query->select([
'a.auto_id auto_id',
'm.merk merk',
'a.model model',
'a.uitvoering uitvoering',
'k.kleur kleur',
't.transmissie transmissie',
'a.kmstand kmstand',
'a.bouwjaar bouwjaar',
'a.vermogen vermogen',
'b.brandstof brandstof',
'g.garantie garantie',
'a.prijs prijs',
'kl.postcode postcode',
'kl.woonplaats woonplaats',
'GROUP_CONCAT(DISTINCT(atn.NL)) opties',
'GROUP_CONCAT(DISTINCT(f.foto_id)) fotos'
])
->from('auto_new a')
->join('INNER JOIN', 'tbl_merken m', 'a.merk = m.merk_id') //Merk
->join('INNER JOIN', 'tbl_kleur k', 'a.kleur = k.kleur_id') //Kleur
->join('INNER JOIN', 'tbl_transmissie t', 'a.transmissie = t.transmissie_id') //Transmissie
->join('INNER JOIN', 'tbl_brandstof b', 'a.brandstof = b.brandstof_id') //Brandstof
->join('INNER JOIN', 'tbl_garantie g', 'a.garantie = g.garantie_id') //Garantie
->join('INNER JOIN', 'klanten kl', 'a.ac = kl.ac') //Klantgegevens
//Alle opties van de auto
->leftJoin('auto_accessoire acc', 'a.auto_id = acc.auto_id AND a.ac = acc.ac')
->leftJoin('tbl_accessoires_trader_new atn', 'acc.code_id = atn.code_id')
//Alle foto's van de auto
->leftJoin('auto_foto f', 'a.auto_id = f.auto_id AND a.ac = f.ac')
->groupBy('a.auto_id')
return $query;
}
public function actionGetcarsbyac($ac) {
Yii::$app->response->format = Response::FORMAT_JSON;
$model = $this->modelClass;
$query = Car::getCar();
$query->where(['a.ac' => $ac])
->all(); // here you are completing your query
return $query;
}
希望这能奏效……确实如此。但现在它并没有给我一个带数据的json,而是一个带查询的json:以前我们对query builder对象使用速记,现在我将它改为常规形式..嗯,这不会改变任何东西你能尝试
return$query->where(['a.ac'=>$ac])->all()吗代码>取而代之?谢谢Clyff。刚刚找到了哈哈