Sửa đổi gián tiếp thuộc tính quá tải Thuộc tính người dùng mô hình ứng dụng không có tác dụng

Due to how accessing model attributes is implemented in Eloquent, when you 
access $category->specifics, a magic __get[] method is called that returns a 
copy of that attributes value. Therefore, when you add an element to that copy,
you are just changing the copy, not the original attributes value. That's why 
you're getting an error saying that whatever you're doing, it won't have any 
effect.

If you want to add a new element to $category->specifics array, you need to 
make sure that the magic __set[] is used by accessing the attribute in a setter 
manner, e.g.:

$category->specifics = 
		array_merge[$category->specifics, $this->request->get['specifics']];

Nếu tôi hiểu vấn đề của bạn. Bạn đang lưu sự tham dự

Thử cái này

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

Hy vọng nó giúp

Ngôn ngữ lập trình PHP hỗ trợ thêm các thuộc tính ảo vào các lớp bằng cách sử dụng các phương thức kỳ diệu. Bạn có thể định nghĩa các phương thức __get[] và __set[], phương thức này sẽ được gọi khi ai đó cố gắng truy cập các thuộc tính không tồn tại. Laravel Eloquent sử dụng tính năng này để cung cấp quyền truy cập vào các thuộc tính của mô hình

Nhưng vấn đề là bạn không thể sửa đổi các thuộc tính được truy cập bằng các phương thức ma thuật. Bạn có thể lấy giá trị và đặt giá trị của thuộc tính, nhưng không thể sửa đổi nó. Nếu bạn cố làm điều này, bạn sẽ nhận được một Ngoại lệ với thông báo “Sửa đổi gián tiếp thuộc tính quá tải không có tác dụng”. Bạn có thể gặp trường hợp này khi cố gắng thêm phần tử khác vào trường mảng trong mô hình Eloquent

Làm thế nào để giải quyết vấn đề này?

Hãy tạo một mô hình để thử nghiệm. Nó sẽ là lớp Article với trường cài đặt được chuyển thành một mảng

class Article extends Model
{
    protected $casts = [
        'settings' => 'array'
    ];

    protected $attributes = [
        'settings' => '[]'
    ];
    ......
}

Nếu bạn cố gắng sửa đổi trường trực tiếp, bạn sẽ nhận được ngoại lệ

$article->settings[] = 'second';

Cách đơn giản nhất để khắc phục điều này là lưu mảng vào một biến cục bộ, thêm một phần tử và đặt kết quả làm giá trị cho trường cài đặt. Ví dụ

$settings = $article->settings;
$settings[] = 'second';
$article->settings = $settings;

Ngoài ra, bạn có thể viết nó trong một dòng bằng cách sử dụng array_merge[]

$article->settings = array_merge[$article->settings, ['second']];

Nếu bạn không thích cách tiếp cận này, bạn có thể giải quyết nó theo cách phức tạp hơn. Bạn có thể chuyển trường cài đặt thành một đối tượng thay vì một mảng và tương tác với các thuộc tính của đối tượng này. Đầu tiên, tạo một lớp DTO cho các cài đặt

class ArticleSettings
{
   public array $list;

    public function __construct[array $list]{
       $this->list = $list;
    }

     public function toArray[]{
         return $this->list;
     }
}

Sau đó, tạo một diễn viên sẽ chuyển đổi mảng thành đối tượng của lớp này và hoàn nguyên nó để lưu trong cơ sở dữ liệu

class ArticleSettingsCast implements CastsAttributes
{
    public function get[$model, $key, $value, $attributes]
    {
        return new ArticleSettings[
            json_decode[$attributes['settings']],
        ];
    }

    public function set[$model, $key, $value, $attributes]
    {
        if [!$value instanceof MessagesBag] {
            throw new \InvalidArgumentException['Unsupported value!'];
        }

        return [
            'settings' => $value->toArray[]
        ];
    }
}

Bây giờ, hãy cập nhật mảng $casts trong lớp Article

________số 8

Sau này, bạn có thể sửa đổi thuộc tính danh sách của đối tượng cài đặt theo ý muốn. Ví dụ

$article->settings->list[] = 'green';

Ngoài ra, bạn có thể đi theo hướng đối tượng hơn. đặt thuộc tính danh sách trong ArticleSettings ở chế độ riêng tư và thêm phương thức có thể thêm giá trị vào mảng danh sách. Nó sẽ hoạt động như thế này

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

kết thúc

Trong bài viết ngắn này, chúng tôi đã giải thích cách khắc phục ngoại lệ khi việc sửa đổi gián tiếp thuộc tính quá tải không có tác dụng trong Laravel. Bạn có biết một cách hiệu quả hơn để khắc phục điều này? . Bạn cũng có thể quan tâm đến cách sửa lỗi chuyển đổi mảng thành chuỗi trong Laravel?

Chủ Đề