Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

noblemfd's avatar

How to use updateOrCreate for a specific Query

I have this Query:

         $goaltypes                   = GoalType::where('company_id', $userCompany)->whereNotNull('parent_id')->get();
         $ids = $goaltypes->pluck('id');
         $goaltypedetails            = Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();

         foreach($goaltypes as $goaltype){   	
            $data = Goal::updateOrCreate(
                [
                    'goal_type_id' => $goaltype['id'],
                    'identity_id' => $goal->apidentity_id, 
                    'employee_code' => $employeeCode,
                    ],
                [
                                'goal_title'                       => $goaltype['name'],
                    ]
            );      
        }

How do I apply updateOrCreate for $goaldetails instead of:

$data = Goal::updateOrCreate(

that doesn't trim it down to the condition?

Thanks

0 likes
8 replies
automica's avatar

@noblemfd

How do I apply updateOrCreate for $goaldetails

where are you defining $goaldetails? Its not evident from your pasted code what that is.

noblemfd's avatar

@automica - It should updateOrCreate the rows that satisfies this condition:

$goaltypedetails            = Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();

That means instead of Goal::updateOrCreate that doesnt'have any condition, it should be:

Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();

See the function:

     $goaltypes                   = GoalType::where('company_id', $userCompany)->whereNotNull('parent_id')->get();
     $ids = $goaltypes->pluck('id');
     $goaltypedetails            = Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();

     foreach($goaltypes as $goaltype){   	
        $data = Goal::updateOrCreate(
            [
                'goal_type_id' => $goaltype['id'],
                'identity_id' => $goal->apidentity_id, 
                'employee_code' => $employeeCode,
                ],
            [
                            'goal_title'                       => $goaltype['name'],
                ]
        );      
    }

I want to replace

$data = Goal::updateOrCreate(

with

Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();
Sinnbeck's avatar

I dont think you can do an updateOrCreate on multiple values at once. You would need one for each

foreach ($ids as $id)
    Goal::updateOrCreate([
     'goal_type_id' => $id,
     'employee_id' => $userEmployee,
     'deleted_at' => null,
], ['mycolumn' => 'new value']);
}
noblemfd's avatar

@sinnbeck - How do I now do :

$goaltype['name']

as applied in

        [
                        'goal_title'                       => $goaltype['name'],
            ]

$goaltype['name'] is from

$goaltypes                   = GoalType::where('company_id', $userCompany)->whereNotNull('parent_id')->get();
automica's avatar

@noblemfd just iterate through $goalTypes then:

$goalTypes = GoalType::where('company_id', $userCompany)->whereNotNull('parent_id')->get();

foreach ($goalTypes as $goalType) {
    Goal::updateOrCreate([
        'goal_type_id' => $goalType->id,
        'employee_id' => $userEmployee,
        'deleted_at' => null,
    ], ['goal_title' => $goalType->name]);
};
noblemfd's avatar

@automica - Is there anything like:

$goaltypedetails            = Goal::whereIn('goal_type_id', $ids)->where('employee_id', $userEmployee)->whereNull('deleted_at')->get();

 $goaltypedetails->updateOrCreate([
...
]);
noblemfd's avatar

@michaloravec - Yes.

updateOrCreate in the documentation only deals with something like:

$flight = App\Flight::updateOrCreate

which doesn't have condition like mine

Please or to participate in this conversation.