2016-02-15 2 views
3

Я создал простой REST API с каркасом Yii2. Я создал контроллер с некоторыми запросами для получения данных из базы данных. Но теперь я хочу отделить эти запросы от контроллера. Я думал, что я включил функцию для получения запроса в Model (ActiveRecord), но я не могу получить доступ к этому методу с моего контроллера.Yii2 использовать методы в контроллере из модели (REST API)

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() на не-объекте

Я не знаю, что делать или где разместить запрос методы.

ответ

2

Я думаю, что это происходит потому, что когда вы положили ->all() или ->one() или любой другой query method это дает заполненный объект результата, который вы не можете запросить дополнительно ...

Так что, когда вы хотите работать дальше к этому запросу вы РЕКОМЕНДУЕМЫМ возвратите запрос без метода запроса, а затем заполните этот запрос в действие вашего контроллера. Так что, делая это, как ваш код будет, как:

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; 
    } 

Обратите внимание, что я удалил ->all() из getCar(). И теперь ваше действие будет как:

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; 
} 

Надеется, что это должно работать ...

+0

Вот это на самом деле. Но теперь это не дает мне json с данными, а json с запросом: https://gyazo.com/a39da3d2f25ee0ff0e25e21824f605a6 –

+0

Раньше мы использовали короткую руку для объекта Query builder, теперь я изменил его на обычную форму. –

+0

хм, это ничего не меняет –

Смежные вопросы