Yii2 — установка идентификатора пользователя на ноль дает мне не объектную ошибку

Я работаю над yii2, В моем проекте я использую модуль с именем SIM Management в котором есть SIM List, SIM Issue а также SIM Return, SIM List иметь issued_to а также returned_by поля, которые сообщают пользователю, какая сима была выдана и возвращена тому или иному пользователю.

Теперь я хочу сделать, что всякий раз, когда SIM выдается returned_by поле основной таблицы должно быть пустым. Этот шаг реализован и работает независимо от того, была ли ранее выдана SIM-карта.

Во-вторых, когда я хочу вернуть SIM-карту, issued_to поле основной таблицы должно быть пустым. Этот шаг реализован, но не работает.

Модель SIM

Ниже у меня есть эти две функции

 public static function sim_issue_del($id,$historic)
{
$sims = Sims::find()->where(['id'=>$id,'historic'=>$historic])->one();
$sims->returned_by = null;
return $sims->save();
}

public static function updIssueuser($id,$historic)
{
$sims = Sims::find()->where(['id'=>$id,'historic'=>$historic])->one();
$sims->issued_to = null;
return $sims->save();

}

Кроме того, у меня есть еще две функции, которые дают мне имя пользователя

  public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'issued_to']);
}public function getUser2()
{
return $this->hasOne(User::className(), ['id' => 'returned_by']);
}

Контроллер выдачи SIM-карты

 $m = new SimIssueanceTransaction();
$m->load(Yii::$app->request->post());
$m->images = '';
$m->sim_id = $v;
$m->issued_by = Yii::$app->user->id;
$m->issued_at = date('Y-m-d h:i:s');
$m->imsi = Sims::idToims($v);

Sims::sim_issue_del($v,$m->historic); // this function works properly

Контроллер возврата SIM

 if($m->save())
{
Sims::sim_user_return($m->sim_id,$m->return_by);
Sims::updIssueuser($v,$m->historic);// this functions works but on main sim list view the it gives error
SimIssueanceTransaction::idTodel($v);
}

Ошибка

Попытка получить свойство необъекта (Строка 90)

 [
'label' => 'Returned By',
'value' => function ($d) {
if(is_object($d->user2))
//return $d->user->name;
return $d->returned_by == '' ? '' : $d->user->username;// line 90 is this
return ' - ';
// return $d->user->name;

},
'filter' => Html::activeDropDownList($searchModel, 'returned_by', \app\models\User::toArrayList(), ['prompt' => "Users", 'class' => 'form-control']),

],

Как я устанавливаю значение null за issue_to Я не вижу причин, почему ошибка отображается на returned_by, Также я проверил таблицу БД. Значение issued_to является NULL в то время как returned_by включает в себя user_id, Если я вручную введу идентификатор пользователя в таблицу БД, то ошибка не будет сгенерирована.

Любая помощь будет высоко оценен.

0

Решение

Ваше отношение getUser():

public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'issued_to']);
}

использования issue_to поле, если вы проверите $d->user до линии 90, это даст вам NULL, Прежде чем получить доступ к связанному свойству модели, вы должны проверить, существует ли оно, с помощью:

$d->user ? $d->user->username : NULL

Я не знаю, что вы хотите точно сделать в этом методе, потому что сначала вы проверяете if(is_object($d->user2))потом проверяешь $d->returned_by == '', а затем вы используете $d->user — Зачем? Использовать $d->user2 Вы должны просто использовать:

return $d->user2 ? $d->user2->username : null;

Без каких-либо других проверок, как is_object() или же == ''

2

Другие решения

Модельные методы нуждаются в обработке,

$sims = Sims::find()->where(['id'=>$id,'historic'=>$historic])->one();

if ($sims !== null) {
$sims->returned_by = null;
return $sims->save();
}else {
return false;
}
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector