间接修改过载属性无效

问题描述 投票:2回答:2

当我运行以下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'
        ]);
    }
}
php laravel
2个回答
-2
投票

如果我理解你的问题。你节省了出勤率。

试试这个:

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'
       ]);
    }
}

希望能帮助到你!


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);

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

© www.soinside.com 2019 - 2024. All rights reserved.