2016-03-12 3 views
0

У меня есть пользовательское действие в ActiveController и вам нужно получить некоторые данные, соединяя две таблицы. Я написал следующий запрос.Yii2 rest api join query с ActiveDataProvider

$query = Item::find()->joinWith(['subcategory'])->select(['item.*', 'sub_category.name'])->where(['item.active' => 1])->addOrderBy(['item.id' => SORT_DESC]); 

    $pageSize = (isset($_GET["limit"]) ? $_GET["limit"] : 1) * 10; 
    $page = isset($_GET["page"]) ? $_GET["page"] : 1; 
    $dataProvider = new ActiveDataProvider(['query' => $query, 'pagination' => ['pageSize' => $pageSize, "page" => $page]]); 
    $formatter = new ResponseFormatter(); 
    return $formatter->formatResponse("", $dataProvider->getTotalCount(), $dataProvider->getModels()); 

но бросает исключение

"message": "Setting unknown property: common\\models\\Item::name", 

Вот деталь модели со всеми полями и отношения.

<?php 

namespace common\models; 

use Yii; 
use yii\behaviors\TimestampBehavior; 
use yii\db\BaseActiveRecord; 
use yii\db\Expression; 

/** 
* This is the model class for table "item". 
* 
* @property integer $id 
* @property integer $subcategory_id 
* @property string $title 
* @property resource $description 
* @property integer $created_by 
* @property integer $updated_by 
* @property string $created_at 
* @property string $updated_at 
* @property string $image 
* @property integer $active 
* 
* @property SubCategory $subcategory 
*/ 
class Item extends \yii\db\ActiveRecord 
{ 
    public $imageFile; 

    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'item'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['created_by', 'updated_by'], 'required'], 
      [['subcategory_id', 'created_by', 'updated_by', 'active'], 'integer'], 
      [['description'], 'string'], 
      [['created_at', 'updated_at'], 'safe'], 
      [['title', 'image'], 'string', 'max' => 999], 
      [['title'], 'unique'], 
      [['imageFile'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg'], 

     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() 
    { 
     return [ 
      'id' => 'ID', 
      'subcategory_id' => 'Subcategory ID', 
      'title' => 'Title', 
      'description' => 'Description', 
      'created_by' => 'Created By', 
      'updated_by' => 'Updated By', 
      'created_at' => 'Created At', 
      'updated_at' => 'Updated At', 
      'image' => 'Image', 
      'active' => 'Active', 
      'imageFile' => 'Image', 
     ]; 
    } 


    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getSubcategory() 
    { 
     return $this->hasOne(SubCategory::className(), ['id' => 'subcategory_id']); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getCreatedBy() 
    { 
     return $this->hasOne(User::className(), ['id' => 'created_by']); 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getUpdatedBy() 
    { 
     return $this->hasOne(User::className(), ['id' => 'updated_by']); 
    } 

    public function behaviors() 
    { 
     return [ 
      'timestamp' => [ 
       'class' => TimestampBehavior::className(), 
       'attributes' => [ 
        BaseActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'], 
        BaseActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at', 
       ], 
       'value' => new Expression('NOW()'), 
      ], 
     ]; 
    } 
} 
+0

Я думаю, ваша модель товара не имеют объявленную переменную $ name. –

+0

yes У него нет, имя принадлежит Подкатегории. – Master

+0

показать вам модель товара – scaisEdge

ответ

0

JoinWith делает запрос с использованием запрошенных соединений, но данные результата отображаются в исходной модели (в данном случае Item).

Поскольку у вас есть select(['item.*', 'sub_category.name']), структура попытается заполнить поле «имя» модели Item, которого не существует, и это порождает ошибку.

Согласно с документацией (http://www.yiiframework.com/doc-2.0/guide-rest-resources.html#overriding-extra-fields) вы должны иметь дб отношение подкатегорию заполняется из БД, по умолчанию, но я не вижу подкатегорию соотношение в вашей модели.

Таким образом, вы должны только создать Подкатегория отношения в вашей модели, такие как:

public function getSubcategory() { return $this->hasOne(Subcategory::className(), ['id' => 'subcategory_id']); } 

Таким образом, вы должны решить вашу проблему.

Другое решение, чтобы иметь пользовательские поля из нескольких моделей может быть:

1) Создание SQL View (и от создания модели) с полями, которые вы хотите, и передать его в ActiveDataProvide

2) Override extraFields метод модели (http://www.yiiframework.com/doc-2.0/yii-base-arrayabletrait.html#extraFields%28%29-detail)

Опять же, я предлагаю вам прочитать эту хорошую статью: http://www.yiiframework.com/wiki/834/relational-query-eager-loading-in-yii-2-0/

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