Я работаю над 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
, Если я вручную введу идентификатор пользователя в таблицу БД, то ошибка не будет сгенерирована.
Любая помощь будет высоко оценен.
Ваше отношение 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()
или же == ''
$sims = Sims::find()->where(['id'=>$id,'historic'=>$historic])->one();
if ($sims !== null) {
$sims->returned_by = null;
return $sims->save();
}else {
return false;
}