Php Yii2从模型(RESTAPI)在控制器中使用方法

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

我用Yii2框架制作了一个简单的restapi。我制作了一个带有一些查询的控制器,用于从数据库中获取数据。但是现在我想把这些查询从控制器中分离出来。我认为我应该把函数放在模型(ActiveRecord)中获取查询,但是我不能从我的控制器访问该方法

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。刚刚找到了哈哈