Как вытащить Relations в GridView?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Как вытащить Relations в GridView?

Сообщение Medic84 »

Имеется код в контроллере:

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

$humans = Humans::find()->select(['humans.id', 'lastname','name','fname','email','gender'])->joinWith('organization');
$dataProvider = new ActiveDataProvider([
        'query' => $humans,
        'pagination' => [
            'pageSize' => 20,
            ],
        ]);
        
        return $this->render('search', [
            'dataProvider' => $dataProvider,
            'model' => $model,
            ]);
В модели:

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

/**
     * @return \yii\db\ActiveQuery
     */
    public function getOrganization()
    {
        return $this->hasOne(HumanOrganizations::className(), ['humanid' => 'id'])->select(['work_place','position']);
    }
Как можно вывести в GridView поля из Relations также как остальные:

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

app\models\db\Humans#1
(
    [yii\db\BaseActiveRecord:_attributes] => [
        'id' => 10174036
        'lastname' => 'Иванов'
        'name' => 'Иван'
        'fname' => 'Иванович'
        'email' => '[email protected]'
        'gender' => 'муж'
    ]
    [yii\db\BaseActiveRecord:_oldAttributes] => [
        'id' => 10174036
        'lastname' => 'Иванов'
        'name' => 'Иван'
        'fname' => 'Иванович'
        'email' => '[email protected]'
        'gender' => 'муж'
    ]
    [yii\db\BaseActiveRecord:_related] => [
        'organization' => app\models\db\HumanOrganizations#2
        (
            [yii\db\BaseActiveRecord:_attributes] => [
                'work_place' => 'Работа'
                'position' => 'Работник'
            ]
            [yii\db\BaseActiveRecord:_oldAttributes] => [
                'work_place' => 'Работа'
                'position' => 'Работник'
            ]
            [yii\db\BaseActiveRecord:_related] => []
            [yii\base\Model:_errors] => null
            [yii\base\Model:_validators] => null
            [yii\base\Model:_scenario] => 'default'
            [yii\base\Component:_events] => []
            [yii\base\Component:_behaviors] => []
        )
    ]
    [yii\base\Model:_errors] => null
    [yii\base\Model:_validators] => null
    [yii\base\Model:_scenario] => 'default'
    [yii\base\Component:_events] => []
    [yii\base\Component:_behaviors] => []
)
Во вьюхе:

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

echo GridView::widget([
'dataProvider' => $dataProvider,
'tableOptions' => ['class' => 'table table-hover table-striped'],
'layout' => "<form id=\"humans_table\" method=\"POST\">{items}\n</form><div align=\"center\">{pager}\n<br />\n{summary}</div>",
'columns' => [
    ['label' => '',
    'format' => 'raw',
    'value' => function($data){
        return '<label class="checkbox">
                    <input type="checkbox" name="uschk_' . $data->id . '" value="' . $data->id . '" data-toggle="checkbox">
                </label>'; }
    ], ['class' => 'yii\grid\SerialColumn'],
    'lastname:text:Фамилия',
    'name:text:Имя',
    'fname:text:Отчество',
    'gender:text:Пол',
    'email:text:EMail',
    'organization.work_place:text:Место работы',
    'organization.position:text:Должность',
    ['label' => '',
     'format' => 'raw',
     'value' => function($data){
        return '<button type="button" rel="tooltip" title="Редактировать" class="btn btn-info btn-simple btn-xs">' . Html::a(' ', yii\helpers\Url::to(['pprog/edit', 'user' => $data->id]), ['class' => 'fa fa-edit']) . '</button>'; }
    ]
],
]);
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как вытащить Relations в GridView?

Сообщение zelenin »

согласно документации
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Как вытащить Relations в GridView?

Сообщение rak »

а это что?

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

'organization.work_place:text:Место работы',
'organization.position:text:Должность',
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: Как вытащить Relations в GridView?

Сообщение Medic84 »

rak писал(а): 2017.02.18, 17:34 а это что?

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

'organization.work_place:text:Место работы',
'organization.position:text:Должность',
Место в коде, которое не работает (
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Как вытащить Relations в GridView?

Сообщение Йож »

Medic84 писал(а): 2017.02.18, 18:36
rak писал(а): 2017.02.18, 17:34 а это что?

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

'organization.work_place:text:Место работы',
'organization.position:text:Должность',
Место в коде, которое не работает (
Этот текст должен быть в label.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Как вытащить Relations в GridView?

Сообщение Nerf »

Йож писал(а): 2017.02.18, 18:45 Этот текст должен быть в label.
С чего вдруг?
Вроде, все корректно. Попробуйте без "формата:заголовка" или без использования сокращений.
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: Как вытащить Relations в GridView?

Сообщение Medic84 »

Йож писал(а): 2017.02.18, 18:45 Этот текст должен быть в label.
Не угадали. Я как обычно уже сам нашел свою же проблему. Ошибка здесь:

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

public function getOrganization()
    {
        return $this->hasOne(HumanOrganizations::className(), ['humanid' => 'id'])->select(['work_place','position']);
    }
Если с hasOne(hasMany) используется select, то помимо искомых полей обязательно должны быть поля, по которым происходит отбор. В данном случае: humanid

Правильный вариант:

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

public function getOrganization()
    {
        return $this->hasOne(HumanOrganizations::className(), ['humanid' => 'id'])->select(['humanid','work_place','position']);
    }
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Как вытащить Relations в GridView?

Сообщение Nerf »

Medic84 писал(а): 2017.02.18, 19:19 Правильный вариант:

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

public function getOrganization()
    {
        return $this->hasOne(HumanOrganizations::className(), ['humanid' => 'id']);
    }
А вы пишите дичь своими селектами. Да и судя по структуре у вас в БД 1:М, а в релейшене hasOne.
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: Как вытащить Relations в GridView?

Сообщение Medic84 »

Nerf писал(а): 2017.02.18, 19:44 А вы пишите дичь своими селектами. Да и судя по структуре у вас в БД 1:М, а в релейшене hasOne.
Почему дичь то? А зачем мне чертова туча лишних полей из релейшена если будут использоваться всего 2?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Как вытащить Relations в GridView?

Сообщение Nerf »

Medic84 писал(а): 2017.02.18, 20:19
Nerf писал(а): 2017.02.18, 19:44 А вы пишите дичь своими селектами. Да и судя по структуре у вас в БД 1:М, а в релейшене hasOne.
Почему дичь то? А зачем мне чертова туча лишних полей из релейшена если будут использоваться всего 2?
Зачем тогда вам "чертова туча лишних полей" в БД, если "будут использоваться всего 2". Для каждого случая будете новую связь писать? AR актуальна только с полным набором полей.
Medic84
Сообщения: 61
Зарегистрирован: 2017.01.28, 17:48

Re: Как вытащить Relations в GridView?

Сообщение Medic84 »

Nerf писал(а): 2017.02.18, 20:35 Зачем тогда вам "чертова туча лишних полей" в БД, если "будут использоваться всего 2". Для каждого случая будете новую связь писать? AR актуальна только с полным набором полей.
Аргумент. Ну я пока сложные связи AR не осилил пока. Оставлю пока так ) Спасибо.
Ответить