【问题标题】:Indirect modification of overloaded property has no effect重载属性的间接修改没有效果
【发布时间】:2018-05-22 07:02:05
【问题描述】:

当我运行以下 API 时出现此错误

“间接修改重载属性App\User::$attendance无效”。

这么久我还是想不通。请有人帮我解决这个问题。

public function apiPresent( $id, Request $request )
{
    $tokenuser = User::with('attendance')
                    ->where('token', $request->input('token'))->first();
    $present   = $request->input('present');
    $user      = User::with('attendance')->find($id);

    if( $user && $tokenuser == $user )
    {
        $user->attendance->present = $present;
        $user->attendance->date    = Carbon::now()->format('d-m-Y');
        $user->attendance->time    = Carbon::now()->format('H-i');
        $user->attendance->save();

        return response()->json([
                    'status'  => 'Ok',
                    'message' => 'Present Changed',
                    'Present' => $user->attendance->present
        ]);
    }
    else
    {
        return response()->json([
                    'status'  => 'Fail',
                    'message' => 'Your state does not changed'
        ]);
    }
}

【问题讨论】:

  • 哪种类型的雄辩关系有很多或属于?在用户::with('出席')
  • @kunal >> 在用户模型中,我使用这个'公共函数出席() { return $this->hasOne('App\Attendance'); }' 在考勤模型中,我使用 public function users() { return $this->hasMany('App\User', 'user_id'); }
  • 我认为您需要以不同的方式保存这是错误的方式@Htoo

标签: php laravel


【解决方案1】:

我认为问题在于您试图直接分配给App::User 的关系。您的代码段突出显示了这一点:

if( $user && $tokenuser->id == $user->id ){
    $user->attendance->present = $present;
    $user->attendance->date    = Carbon::now()->format('d-m-Y');
    $user->attendance->time    = Carbon::now()->format('H-i');
    $user->attendance->save();
    ...

在 Eloquent 中,您可以使用魔术__get() 方法将关系作为属性访问,该方法返回对象的副本

当您尝试为任何关系的属性(在本例中为 $user->attendance)分配任何值时,它根本不会对原始对象产生任何影响,因此警告。

您可以通过创建新对象实例并将其添加到create 方法来解决此问题,如下所示:

$attendance = new Attendance();
$attendance->present = $present;
$attendance->date    = Carbon::now()->format('d-m-Y');
$attendance->time    = Carbon::now()->format('H-i');
$user->attendance->create($attendance);

这将使用外键保存新记录。

【讨论】:

    【解决方案2】:

    就我而言

    Laravel php 5.7 & Mysql 5.7 我为以下代码得到的错误是 间接修改重载属性 Illuminate\Http\Request::${

    错误代码

     $config->name = $request->title;
            $config->lead_by_id = $request->owner;
            $config->tech_stack = $request->stack;
            $config->is_POC = $request->
            $config->updated_by = $request->
            $config->start_date = $request->start_date;
            $config->end_date = $request->end_date;
    

    然后我发现我没有正确设置请求变量

    修复

     $config->name = $request->title;
            $config->lead_by_id = $request->owner;
            $config->tech_stack = $request->stack;
            $config->is_POC = $request->poc;
            $config->updated_by = $request->$user->id;
            $config->start_date = $request->start_date;
            $config->end_date = $request->end_date;
    

    【讨论】:

      【解决方案3】:

      如果我了解您的问题。您正在保存出勤率。

      试试这个:

      use App\Attendance; // Add before controller declaration
      
      public function apiPresent( $id, Request $request )
      {
          $tokenuser = User::where('token', $request->input('token'))->first();
          $present   = $request->input('present');
          $user      = User::find($id);
      
          if( $user && $tokenuser->id == $user->id ){
              $attendance = new Attendance;
              $attendance->present = $present;
              $attendance->date    = Carbon::now()->format('d-m-Y');
              $attendance->time    = Carbon::now()->format('H-i');
              $attendance->save();
      
              return response()->json([
                      'status'  => 'Ok',
                      'message' => 'Present Changed',
                      'Present' => $present
             ]);
          }
          else {
              return response()->json([
                      'status'  => 'Fail',
                      'message' => 'Your state does not changed'
             ]);
          }
      }
      

      希望对你有帮助!

      【讨论】:

      • 这对我来说就像魔术一样!多谢兄弟 !你帮我度过了愉快的一天!
      • 您能说明问题是什么吗?是否使用了use 语句?为什么 OP 没有为此添加一点?
      • 我对此投了反对票,因为这并没有强调修复是什么以及哪里出了问题
      • @kunal 是如何工作的?您只是创建了一个新的出勤实例,并没有将其与用户对象紧密结合。
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多