GodziLaravel's avatar

save() is not working!

Hello,

I have an issue related to save().

I added save () inside a loop as you can see bellow but it's not saving !

$overdueMaterialPlannings = MaterialPlanning::where('end_date','<=', Carbon::now()->subDay()->format('Y-m-d'))->where('has_returned', false)->where('status',2)->get();
foreach ($overdueMaterialPlannings as $overdueMaterialPlanning) {
    try {
        $overdueMaterialPlanning->end_date = Carbon::now()->subDay()->format('Y-m-d');
        empty($overdueMaterialPlanning->amount_days_overdue) ? $overdueMaterialPlanning->amount_days_overdue = 1 : $overdueMaterialPlanning->amount_days_overdue++;
      
        $overdueMaterialPlanning->save();

        $delay = DB::table('jobs')->where('queue','default')->count() * 20;
        dispatch(new \App\Jobs\SendMaterialRelatedMail("sendOverdueMailAction",$overdueMaterialPlanning))
            ->delay($delay);

        $this->notifyOtherInstances($overdueMaterialPlanning);
    } catch (\Exception $e) {
        // Log or handle the exception
        \Log::error('Error saving material planning: ' . $e->getMessage());
    }
}

MaterialPlanning Model :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MaterialPlanning extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        "material_id",
        "borrow_user_id",
        "teamleader_companies_location_id",
        "start_date",
        "end_date",
        "status",
        "comment",
        "request_date",
        "reply_date",
        "has_returned",
    ];

    public function material()
    {
        return $this->hasOne(Material::class);
    }

    public function borrowUser()
    {
        return $this->hasOne(User::class);
    }

    public function teamleaderCompaniesLocation()
    {
        return $this->hasOne(TeamleaderCompany::class);
    }
}

Any idea please ?

0 likes
4 replies
Snapey's avatar

Are any jobs created?

My first guess is that your first query returns no results.

GodziLaravel's avatar

@Snapey thanks for your answer,

Yes jobs are created correctly and also when I add a log info before save() I see the expected data. But it's not saved !

          Log::info($overdueMaterialPlanning);
			$overdueMaterialPlanning->save();
tangtang's avatar

@godzilaravel

base in this code

$overdueMaterialPlannings = MaterialPlanning::where('end_date','<=', Carbon::now()->subDay()->format('Y-m-d'))->where('has_returned', false)->where('status',2)->get();

not needed use foreach to update data. try this

$overdueMaterialPlannings = MaterialPlanning::where('end_date','<=', Carbon::now()->subDay()->format('Y-m-d'))->where('has_returned', false)->where('status',2);

$overdueMaterialPlannings->end_date = Carbon::now()->subDay()->format('Y-m-d');
empty($overdueMaterialPlannings->amount_days_overdue) ? $overdueMaterialPlannings->amount_days_overdue = 1 : $overdueMaterialPlannings->amount_days_overdue++;

$overdueMaterialPlannings->save();
or
$overdueMaterialPlannings->update(); // choose one method save or update

it will update all the row if match with this condition :where('end_date','<=', Carbon::now()->subDay()->format('Y-m-d'))->where('has_returned', false)->where('status',2)

and dont use get() because you can't save data on collection.

tangtang's avatar

@godzilaravel

or if this new data

may do it like this for reference

$overdueMaterialPlannings = MaterialPlanning::where('end_date','<=', Carbon::now()->subDay()->format('Y-m-d'))->where('has_returned', false)->where('status',2)->get();
foreach ($overdueMaterialPlannings as $overdueMaterialPlanning) {
    try {
$saveNewData= new MaterialPlanning;
        $saveNewData->end_date = Carbon::now()->subDay()->format('Y-m-d');
        empty($overdueMaterialPlanning->amount_days_overdue) ? $saveNewData->amount_days_overdue = 1 : $saveNewData->amount_days_overdue++;
      
        $saveNewData->save();

        $delay = DB::table('jobs')->where('queue','default')->count() * 20;
        dispatch(new \App\Jobs\SendMaterialRelatedMail("sendOverdueMailAction",$overdueMaterialPlanning))
            ->delay($delay);

        $this->notifyOtherInstances($overdueMaterialPlanning);
    } catch (\Exception $e) {
        // Log or handle the exception
        \Log::error('Error saving material planning: ' . $e->getMessage());
    }
}

Please or to participate in this conversation.