Как в грамотно учесть ситуацию в Grid

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

В общем есть 2 таблицы. вакансии и отлики.

У откликов задана связь один к одному

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

public  function getVacancies()
    {
        return $this->hasOne(Vacancies::className(), ['id'=> 'vac_id']);
    }
Дело происходит в админке. Делаю красивый вывод чтобы показывало вместо vac_id название вакансии.
В представлении же сам Грид такой

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

 <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [

            'id',
            [
                'attribute' => 'vac_id',
                'value' => function($data)
                {
                    return $data->vacancies['name']? $data->vacancies['name']: false;
                },

            ],
            'name:ntext',
            'age',
            'text:ntext',

            ['class' => 'yii\grid\ActionColumn'],
        ],
        'tableOptions' => [
            'class' => 'table table-bordered  table-hover table-responsive table-dark '
        ],



    ]); ?>


Но моя ситуация не учитывает такую штуку. Если вакансия удалена, то отзывы на неё не удаляются.
Т е в админке я вижу отклики на несуществующие вакансии.

Как это правильно сделать чтобы оно не выбивало строки, где vac_id не имеет id в таблице вакансий
Изучаю веб-программирование, не ругайтесь сильно)
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение lenbord »

Выбирайте только те отклики, которые ссылаются на существующие записи вакансий, а не все подряд
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

lenbord писал(а): 2018.03.05, 13:56 Выбирайте только те отклики, которые ссылаются на существующие записи вакансий, а не все подряд
Это то понятно, вопрос как
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как в грамотно учесть ситуацию в Grid

Сообщение andku83 »

можно чуть проще написать:

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

            [
                'attribute' => 'vac_id',
                'value' => 'vacancies.name'
            ],
а по вопросу как бы при наличии связей в БД у вас не должно быть откликов для несуществующих вакансий:
1. нужно либо переключать статус у вакансии на отключен,
2. либо удалять отзывы вместе с вакансиями
3. Ну еще возможный вариант при удалении вакансии в vac_id записывать NULL

и это все лучше реализовать внутри БД посредством внешнейСвязи(FK)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

shnir писал(а): 2018.03.05, 14:17 можно чуть проще написать:

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

            [
                'attribute' => 'vac_id',
                'value' => 'vacancies.name'
            ],
а по вопросу как бы при наличии связей в БД у вас не должно быть откликов для несуществующих вакансий:
1. нужно либо переключать статус у вакансии на отключен,
2. либо удалять отзывы вместе с вакансиями
3. Ну еще возможный вариант при удалении вакансии в vac_id записывать NULL

и это все лучше реализовать внутри БД посредством внешнейСвязи(FK)
Ну увы, отлики на несуществующие вакансии могут быть в админке по той причине, допустим , удаления из БД вакансии.

Конечно можно было просто возращать инфу о том что она удалена

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

 [
                'attribute' => 'vac_id',
                'value' => function($data)
                {
                    return $data->vacancies['name']? $data->vacancies['name']: "Вакансия удалена";
                },

            ],


Но тогда будет сам грид засоряться.

2) Удалять руками отклики вместе с вакансиями тоже такое себе. Лучше это всё делать автоматически. Либо как то модифицировать удаление в админке. Допустим при удалении вакансии с таким то айди ещё и удалять из таблицы отклики с таким же айди. Блин, а это же идея, пойду так сделаю
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как в грамотно учесть ситуацию в Grid

Сообщение andku83 »

dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

shnir писал(а): 2018.03.05, 14:41 foreign key
Готово :D

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

 public function actionDelete($id)
    {
        $this->findModel($id)->delete();
        Response::deleteAll(['vac_id' => $id]);


        return $this->redirect(['index']);
    }
Теперь при удалении вакансии оно удаляет из таблицы отклики с таким же ID.
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как в грамотно учесть ситуацию в Grid

Сообщение andku83 »

dunakov писал(а): 2018.03.05, 14:44
Готово :D

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

 public function actionDelete($id)
    {
        $this->findModel($id)->delete();
        Response::deleteAll(['vac_id' => $id]);


        return $this->redirect(['index']);
    }
Теперь при удалении вакансии оно удаляет из таблицы отклики с таким же ID.
это должно происходить внутри БД, все-таки почитайте что такое FK
Последний раз редактировалось andku83 2018.03.05, 15:40, всего редактировалось 1 раз.
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

shnir писал(а): 2018.03.05, 14:41 foreign key
А ещё не подскажете такую штуку. У меня для вывода пользователю в Таблице вакансии есть поле availability

Естесна если 1 вакансия актуально, если 0 неактуальна.

Но в админке 1 и 0 не хорошо, Поэтому в индексе сделал Так

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

[
                'attribute' => 'availability',
                'value' => function($data)
                {
                    return $data->availability ? 'Актуально' : 'Неактуально';
                },

            ],


Но при редактировании и создании я хочу чтобы в это поле заносили не 0 и 1 руками, а выбивари из двух вариантов Актуально, неактуально.
Делать это нужно как я понял через тот же DropDownList

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

 <?php echo $form->field($model, 'category_id')->dropDownList(\yii\helpers\ArrayHelper::map(\app\modules\admin\models\Category::find()->all(), 'id' , 'name'))?>
Так я делал вместо id категории вывод названия категории. А как вместо 1 и 0 в форме использовать слова актуально и неактуально, но чтобы не создавать ещё одну таблицу?
Изучаю веб-программирование, не ругайтесь сильно)
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение lenbord »

<?= $form->field($model, 'availability')->dropDownList(['Неактуально', 'Актуально']); ?>
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение lenbord »

но лучше будет в Классе объявить метод getAvailabilityList и вызывать его в самом представлении вот так:

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

public function getAvailabilityList()
{
    return [
        'Неактуально',
        'Актуально',
    ];
}
а в представлении дергать этот метод:

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

<?= $form->field($model, 'availability')->dropDownList($model->getAvailabilityList()); ?>
это избавит Вас от того, чтобы лазить по коду представления и что-то поменять, если это будет нужно
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

lenbord писал(а): 2018.03.05, 15:19 <?= $form->field($model, 'availability')->dropDownList(['Неактуально', 'Актуально']); ?>
Хм, я вроде что-то похожее пробовал и не работало. А это работает.
Изучаю веб-программирование, не ругайтесь сильно)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

Пойду почитаю dropDownList, чтобы понять как это произошло так)
Изучаю веб-программирование, не ругайтесь сильно)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

А всё понял.
Я записал в более понятном виде

<?= $form->field($model, 'availability')->dropDownList(['0'=>'Неактуально','1'=> 'Актуально']); ?>

Этот же параметр одномерный массив. А то так непонятно, откуда оно выясняет что 0 это неактуально, а 1 актуально.

А в виде Ключ = > значение как то более понятно
Изучаю веб-программирование, не ругайтесь сильно)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Как в грамотно учесть ситуацию в Grid

Сообщение andku83 »

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

    const STATUS_NOT_ACTIVE = 1;
    const STATUS_ACTIVE = 2;
    const STATUS_DELETED = 3;
    public static function availabilities()
    {
        return [
            self::STATUS_NOT_ACTIVE => Yii::t('backend', 'Not Active'),
            self::STATUS_ACTIVE => Yii::t('backend', 'Active'),
            self::STATUS_DELETED => Yii::t('backend', 'Deleted')
        ];
    }

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

<?= $form->field($model, 'availability')->dropDownList(Vacancy::availabilities()); ?> 
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение rugabarbo »

shnir писал(а): 2018.03.05, 15:14это должно происходить внутри БД, все-таки почитайте что такое FK
Может.
Не должно.
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

shnir писал(а): 2018.03.05, 15:44

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

    const STATUS_NOT_ACTIVE = 1;
    const STATUS_ACTIVE = 2;
    const STATUS_DELETED = 3;
    public static function availabilities()
    {
        return [
            self::STATUS_NOT_ACTIVE => Yii::t('backend', 'Not Active'),
            self::STATUS_ACTIVE => Yii::t('backend', 'Active'),
            self::STATUS_DELETED => Yii::t('backend', 'Deleted')
        ];
    }

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

<?= $form->field($model, 'availability')->dropDownList(Vacancy::availabilities()); ?> 
Да я тот вариант доработал и всё прекрасно работает, а тут вы заморочились и через константы и через переводчик yii::t()
Изучаю веб-программирование, не ругайтесь сильно)
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Как в грамотно учесть ситуацию в Grid

Сообщение dunakov »

У меня ведь только два состояния Актуально и неактуально. Зависит от того что в поле 0 или 1.
Бд у меня настроена на 1 по умолчанию. Т е при создании вакансии автоматически актуальная и при создании я вообще убрал это поле , а только оставил для редактирования , сделав две формы
Изучаю веб-программирование, не ругайтесь сильно)
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение lenbord »

dunakov писал(а): 2018.03.05, 16:01
shnir писал(а): 2018.03.05, 15:44

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

    const STATUS_NOT_ACTIVE = 1;
    const STATUS_ACTIVE = 2;
    const STATUS_DELETED = 3;
    public static function availabilities()
    {
        return [
            self::STATUS_NOT_ACTIVE => Yii::t('backend', 'Not Active'),
            self::STATUS_ACTIVE => Yii::t('backend', 'Active'),
            self::STATUS_DELETED => Yii::t('backend', 'Deleted')
        ];
    }

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

<?= $form->field($model, 'availability')->dropDownList(Vacancy::availabilities()); ?> 
Да я тот вариант доработал и всё прекрасно работает, а тут вы заморочились и через константы и через переводчик yii::t()
но через константы и будет более правильно, придется чуть-чуть заморочится, но так более красиво и понятно)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как в грамотно учесть ситуацию в Grid

Сообщение ElisDN »

lenbord писал(а): 2018.03.05, 16:06 но через константы и будет более правильно, придется чуть-чуть заморочится, но так более красиво и понятно)
Если это именно да|нет, то сделать просто булево поле. Если больше вариантов, то константы.
Ответить