Yii2-将用户ID设置为null会给出非对象错误

时间:2018-03-01 06:26:29

标签: php activerecord null yii2

我正在研究yii2。在我的项目中,我使用名为SIM Management的模块,其中有SIM ListSIM IssueSIM ReturnSIM Listissued_toreturned_by个字段,告诉用户发出了哪个SIM卡并将其返回给哪个用户。

现在我想做的是,每当发出SIM时,主表的returned_by字段应设置为null / empty。无论以前是否发布过SIM,都会执行此步骤并进行操作。

第二件事是当我想要返回SIM时,主表的issued_to字段应该设置为null / empty。此步骤已实施但无效。

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。如果我在DB表中手动输入用户ID,则不会生成错误。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

您的关系getUser()

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

使用issue_to字段,如果您在第90行之前选中$d->user,则会显示NULL。在访问相关模型属性之前,您必须通过以下方式检查它是否存在:

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

我不知道您希望在此方法中做些什么,因为首先检查if(is_object($d->user2)),然后检查$d->returned_by == '',然后使用 $d->user < / strong> - 为什么?要使用$d->user2,您应该使用:

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

没有任何其他检查,例如is_object()== ''

答案 1 :(得分:-1)

模型方法需要处理,

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

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