试图在yii2中获取非对象的属性

时间:2016-08-24 05:29:11

标签: yii2

我在FrameSearch Model中定制了查询并使用findbysql构建了我的查询。我也在尝试自定义操作列。除了动作列之外,我的gridview看起来很好。 得到错误 - enter image description here

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

添加退出后; enter image description here

请告诉我如何解决这个问题。我想从动作列按钮中获取f_name,我将传递给另一个页面以过滤网格。

1 个答案:

答案 0 :(得分:0)

我通常建议使用ArrayHelper::getValue

例如:

ArrayHelper::getValue($model, 'f_name')
$model是某个对象(ModelActiveRecord),数组或空(=null)时,

将起作用。 此外,它有默认值的第3个参数:

ArrayHelper::getValue($model, 'f_name', 'value that returned when attribute not found in $model')