2016-08-24 3 views
0

私はFrameSearch Modelでクエリをカスタマイズし、findbysqlでクエリを構築しました。また、アクション列をカスタマイズしようとしています。私のgridviewは、アクションの列を除いてよく見えます。 の取得エラー - enter image description hereyii2のアクションオブジェクトでないオブジェクトのプロパティを取得しようとしています

FrameSearchモデルコード -

<?php 

namespace frontend\modules\framestock\models; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use frontend\modules\framestock\models\Frame; 
use frontend\modules\framestock\models\Poitemframe; 
use yii\db\Query; 
use yii\db\Command; 
/** 
* FrameSearch represents the model behind the search form about `frontend\modules\framestock\models\Frame`. 
*/ 
class FrameSearch extends Frame 
{ 
    public $purchase; 
    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['f_id'], 'integer'], 
      [['f_brand', 'f_name','purchase'], 'safe'], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function scenarios() 
    { 
     // bypass scenarios() implementation in the parent class 
     return Model::scenarios(); 
    } 

    /** 
    * Creates data provider instance with search query applied 
    * 
    * @param array $params 
    * 
    * @return ActiveDataProvider 
    */ 
    public function search($params) 
    { 
     $subQuery1 = (new Query())->select(['poi_framename','sum(poi_qty) as purchased'])->from ('poitemframe')->join('LEFT JOIN','Frame','frame.f_name = poitemframe.poi_framename')->groupby('poi_framename');   
     $subQuery2 = (new Query())->select(['o_frame','count(o_frame) as sold'])->from ('orders')->join('LEFT JOIN','Frame','frame.f_name = orders.o_frame')->groupby('o_frame');   
     $query = (new Query())->select(['f_brand','f_name','COALESCE(pt.purchased,0)as purchased' , 'COALESCE(st.sold,0) as sold', '(COALESCE(pt.purchased,0) - COALESCE(st.sold,0)) as stock'])->from ('frame')->leftJoin(['pt' => $subQuery1],'pt.poi_framename = frame.f_name')->leftJoin(['st' => $subQuery2],'st.o_frame = frame.f_name'); 


     // ->joinWith(['purchase']); 
     // $items = $query 
     //   ->select([ 
     //    'f_brand', 
     //    'f_name', 
     //    'sum(poitemframe.poi_qty) as purchased', 
     //    ]) 
     //   //->where(['stock.product_id'=>3]) 
     //   ->groupBy('f_name') 
     //   ->all(); 



     // add conditions that should always apply here 

     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]); 

     $this->load($params); 

     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

     // grid filtering conditions 
     $query->andFilterWhere([ 
      'f_id' => $this->f_id, 
     ]); 

     $query->andFilterWhere(['like', 'f_brand', $this->f_brand]) 
      ->andFilterWhere(['like', 'f_name', $this->f_name]); 

     return $dataProvider; 
    } 
} 

のindex.php

<?php 

use yii\helpers\Html; 
use yii\grid\GridView; 
use yii\db\Query; 
use yii\db\Command; 

/* @var $this yii\web\View */ 
/* @var $searchModel frontend\modules\framestock\models\FrameSearch */ 
/* @var $dataProvider yii\data\ActiveDataProvider */ 

$this->title = 'Frames'; 
$this->params['breadcrumbs'][] = $this->title; 
?> 
<div class="frame-index"> 

    <h1><?= Html::encode($this->title) ?></h1> 
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?> 

    <?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      'f_brand', 
      'f_name', 
      'purchased', 
      'sold', 
      'stock', 

      [ 
      'class' => 'yii\grid\ActionColumn', 
      'template' => '{ledger}', 
      'buttons' => [ 
       'ledger' => function ($url, $model) { 
        return Html::a(
         '<span class="glyphicon glyphicon-eye-open"></span>', 
         ['/frame/ledger', 'f_name' => $model->f_name], 
         [ 
          'title' => 'Ledger', 
          'data-pjax' => '0', 
         ] 
        ); 
       }, 
      ], 
      ], 
     ], 
    ]); ?> 
</div> 

更新

enter image description here

exitを追加した後。 enter image description here

解決方法を教えてください。グリッドをフィルタリングするために別のページに渡すアクションカラムボタンからf_nameを取得します。

+0

「var_dump($ model);」を使用してコンテンツを検査します。 –

+0

その後どの行? – Tanmay

+0

'ledger '=> function($ url、$ model){}' –

答えて

0

通常、ArrayHelper::getValueを使用することをお勧めします。例えば

$modelは、いくつかのオブジェクト(Model又はActiveRecord)、アレイまたは空(=null)である場合

ArrayHelper::getValue($model, 'f_name') 

が動作します。 さらに、デフォルト値の第3引数を持っています。

ArrayHelper::getValue($model, 'f_name', 'value that returned when attribute not found in $model') 
関連する問題