Ошибка "Trying to get property of non-object" + hasOne

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Ошибка "Trying to get property of non-object" + hasOne

Сообщение svil »

В одной таблице Category есть ключ внешний и первичный.Если у категории внешний ключ 0, то категория самостоятельная, то есть родительской категории у нее нет. У родительской категории может быть несколько дочерних, а у дочерней только одна родительская.

id -- parent_id -- name
1 -- 0 -- -- -- -- Автоаксессуары //самостоятельная категория
2 -- 0 -- -- -- -- Автозвук //самостоятельная категория
3 -- 0 -- -- -- -- Автоэлектрика //самостоятельная категория
4 -- 1 -- -- -- -- Автоодеяла //у категории есть родительская Автоаксессуары
... -- ...--...
9 -- 2 -- -- -- -- Автомагнитолы //у категории есть родительская Автозвук

Пока выводятся parent_id категорий, но не name. Нудно в столбце вместо parent_id вывести name
Выскакивает ошибка "Trying to get property of non-object"
Модель Category

Код: Выделить всё

<?php

namespace app\modules\admin\models;

use Yii;

/**
 * This is the model class for table "category".
 *
 * @property string $id
 * @property string $parent_id
 * @property string $name
 * @property string $keywords
 * @property string $description
 */
class Category extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'category';
    }

    public function getCategory(){
        return $this->hasOne(Category::className(), ['id' => 'parent_id']);
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['parent_id'], 'integer'],
            [['name'], 'required'],
            [['name', 'keywords', 'description'], 'string', 'max' => 255],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => '№ категории',
            'parent_id' => 'Родительская категория',
            'name' => 'Название',
            'keywords' => 'Ключевые слова',
            'description' => 'Мета-описание',
        ];
    }
}

Контроллер

Код: Выделить всё

 public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => Category::find()->with('category'),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }
Вид

Код: Выделить всё

<?php

use yii\helpers\Html;
use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

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

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Create Category', ['create'], ['class' => 'btn btn-success']) ?>
    </p>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
//            'parent_id',
            [
                'attribute' => 'parent_id',
                'value' => function($data){
                    return $data->category->name ? $data->category->name : 'Самостоятельная категория';
                },
            ],
            'name',
            'keywords',
            'description',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
</div>

Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Ошибка "Trying to get property of non-object" + hasOne

Сообщение svil »

Нашла ответ сама

Код: Выделить всё

return $data->category ? $data->category->name : 'Самостоятельная категория';
 
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Ошибка "Trying to get property of non-object" + hasOne

Сообщение andku83 »

svil писал(а): 2018.07.16, 23:35 Нашла ответ сама

Код: Выделить всё

return $data->category ? $data->category->name : 'Самостоятельная категория';
 
Можно сделать так:

Код: Выделить всё

return ArrayHelper::getValue($data->category, 'name', 'Самостоятельная категория');
А если не нужно 'Самостоятельная категория' еще красивше будет:

Код: Выделить всё

            [
                'attribute' => 'parent_id',
                'value' => 'category.name'
            ],
И еще - для категорий без родителей лучше использовать значение NULL, а не 0.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Ошибка "Trying to get property of non-object" + hasOne

Сообщение svil »

Спасибо
Ответить