1

I am a newbie in Laravel, and I'm trying to use a foreach loop with updateOrCreate() in the update function. However, it doesn't work, and there is no error. I have the following three models.

Sales Team

class SalesTeam extends Model
{
    public function salesTeamLeaders()
    {
        return $this->belongsToMany(SalesTeamleader::class);
    }

    public function salesTeamMember()
    {
        return $this->belongsToMany(SalesTeamMember::class);
    }

    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

Sales Team Leader

class SalesTeamLeader extends Model
{
    public function salesTeam()
    {
        return $this->hasMany(SalesTeam::class);
    }
}

Sales Team Member

class SalesTeamMember extends Model
{
    public function salesTeam()
    {
        return $this->hasMany(SalesTeam::class);
    }
}

SalesTeam Controller

class SalesTeamController extends Controller
{
    // Update
    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required',
            'description' => '',
        ]);

        $salesteam = SalesTeam::find($id);
        $salesteam->name = $request->name;
        $salesteam->description = $request->description;
        $salesteam->save();

        foreach ($request['leaders'] as $leader) {
            SalesTeamLeader::updateOrCreate([
                'salesteam_id' => $salesteam->id,
                'leader_id' => $leader
            ]);
        }


        foreach ($request['members'] as $member) {
            SalesTeamMember::updateOrCreate([
                'salesteam_id' => $salesteam->id,
                'member_id' => $member
            ]);
        }

        // Flash Message
        Session()->flash("success", "ปรับปรุงข้อมูลเรียบร้อยแล้ว!");
        
        return redirect('/admin/salesTeamDashboard');
    }
}
Karl Hill
  • 12,937
  • 5
  • 58
  • 95
Jill
  • 49
  • 6

2 Answers2

0

First, return simple response to ensure you are getting correct request data and the id. You can replace $request['leaders'] to $request->input('leaders') and $request['members'] to $request->input('members'). You should not put the query builder in the for each loop. Instead process it at first then pass the whole array to update. As query takes some time to run, your for loop may end by this time and go out of scope.

return response()->json([
    'request_data' => $request,
    'id' => $id,
]);
Manan
  • 394
  • 4
  • 15
0

It seems like you just need to sync a list of leader and members for the sales team. Assuming the relationships setup in the SalesTeam model are correct you can use the sync method of the BelongsToMany to do this:

$salesteam->salesTeamLeaders()->sync($request->input('leaders', []));

$salesteam->salesTeamMember()->sync($request->input('members', []));

Though salesTeamMember should be named in the plural.

lagbox
  • 48,571
  • 8
  • 72
  • 83
  • I got this message SQLSTATE[42S02]: Base table or view not found: 1146 Table 'whoservice.sales_team_sales_team_leader' doesn't exist (SQL: select * from `sales_team_sales_team_leader` where `sales_team_id` = 4) – Jill Dec 22 '20 at 11:51
  • yea the relationships aren't setup correctly ... do you have a `leaders` and `members` table? – lagbox Dec 22 '20 at 11:54
  • I have both of them, sir. I named them salesteam_leaders and salesteam_members – Jill Dec 22 '20 at 11:56
  • do you have a table connecting `sales_team` and `salesteam_leaders`? – lagbox Dec 22 '20 at 11:57
  • In SalesTeam Tables. I have 2 fields that are salsteam_id and leader_id. – Jill Dec 22 '20 at 12:02