Страница 1 из 2

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

Добавлено: 2018.03.05, 13:49
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 в таблице вакансий

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

Добавлено: 2018.03.05, 13:56
lenbord
Выбирайте только те отклики, которые ссылаются на существующие записи вакансий, а не все подряд

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

Добавлено: 2018.03.05, 14:15
dunakov
lenbord писал(а): 2018.03.05, 13:56 Выбирайте только те отклики, которые ссылаются на существующие записи вакансий, а не все подряд
Это то понятно, вопрос как

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

Добавлено: 2018.03.05, 14:17
andku83
можно чуть проще написать:

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

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

и это все лучше реализовать внутри БД посредством внешнейСвязи(FK)

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

Добавлено: 2018.03.05, 14:28
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) Удалять руками отклики вместе с вакансиями тоже такое себе. Лучше это всё делать автоматически. Либо как то модифицировать удаление в админке. Допустим при удалении вакансии с таким то айди ещё и удалять из таблицы отклики с таким же айди. Блин, а это же идея, пойду так сделаю

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

Добавлено: 2018.03.05, 14:41
andku83

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

Добавлено: 2018.03.05, 14:44
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.

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

Добавлено: 2018.03.05, 15:14
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

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

Добавлено: 2018.03.05, 15:15
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 в форме использовать слова актуально и неактуально, но чтобы не создавать ещё одну таблицу?

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

Добавлено: 2018.03.05, 15:19
lenbord
<?= $form->field($model, 'availability')->dropDownList(['Неактуально', 'Актуально']); ?>

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

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

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

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

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

<?= $form->field($model, 'availability')->dropDownList($model->getAvailabilityList()); ?>
это избавит Вас от того, чтобы лазить по коду представления и что-то поменять, если это будет нужно

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

Добавлено: 2018.03.05, 15:24
dunakov
lenbord писал(а): 2018.03.05, 15:19 <?= $form->field($model, 'availability')->dropDownList(['Неактуально', 'Актуально']); ?>
Хм, я вроде что-то похожее пробовал и не работало. А это работает.

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

Добавлено: 2018.03.05, 15:26
dunakov
Пойду почитаю dropDownList, чтобы понять как это произошло так)

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

Добавлено: 2018.03.05, 15:33
dunakov
А всё понял.
Я записал в более понятном виде

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

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

А в виде Ключ = > значение как то более понятно

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

Добавлено: 2018.03.05, 15:44
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()); ?> 

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

Добавлено: 2018.03.05, 15:49
rugabarbo
shnir писал(а): 2018.03.05, 15:14это должно происходить внутри БД, все-таки почитайте что такое FK
Может.
Не должно.

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

Добавлено: 2018.03.05, 16:01
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()

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

Добавлено: 2018.03.05, 16:04
dunakov
У меня ведь только два состояния Актуально и неактуально. Зависит от того что в поле 0 или 1.
Бд у меня настроена на 1 по умолчанию. Т е при создании вакансии автоматически актуальная и при создании я вообще убрал это поле , а только оставил для редактирования , сделав две формы

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

Добавлено: 2018.03.05, 16:06
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()
но через константы и будет более правильно, придется чуть-чуть заморочится, но так более красиво и понятно)

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

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