Страница 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
Готово
Код: Выделить всё
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
Готово
Код: Выделить всё
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
А ещё не подскажете такую штуку. У меня для вывода пользователю в Таблице вакансии есть поле 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
но через константы и будет более правильно, придется чуть-чуть заморочится, но так более красиво и понятно)
Если это именно да|нет, то сделать просто булево поле. Если больше вариантов, то константы.