带保留键的Laravel | PHP数组递归合并

带保留键的Laravel | PHP数组递归合并,php,arrays,laravel,eloquent,laravel-relations,Php,Arrays,Laravel,Eloquent,Laravel Relations,我有三个数组 $data1 = []; $data2 =[]; $data3 = []; foreach($request->clients as $client) { $data1[]= [$client=>['role'=>'client']]; } foreach($request->employees as $employee) { $data2[]= [$employee=>['role'=>'employee']]; } forea

我有三个数组

$data1 = []; $data2 =[]; $data3 = [];

foreach($request->clients as $client)
{
  $data1[]= [$client=>['role'=>'client']];
}

foreach($request->employees as $employee)
{
   $data2[]= [$employee=>['role'=>'employee']];
}

foreach($request->users as $user)
{
   $data3[] = [$user=>['role'=>'user']];
}

$data1 = [1=>['role'=>'client'], 2=>['role'=>'client']];
$data2 = [1=>['role'=>'employee']];
$data3 = [1=>['role'=>'user']];

//merge or recursive merge or... $data1, $data2, $data3.

$result = [1=>['role'=>'client'], 2=>['role'=>'user'], 1=>['role'=>'user'], 1=>['role'=>'employee']];
我怎样才能得到这样的结果? 这是给你的


谢谢

与OP讨论后,需要更改结构,以允许关系角色能够与多个角色关联。为了实现这一目标,我们可以做以下几点

模式:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
});

Schema::create('teams', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
});

Schema::create('memberships', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('team_id');
    // Any other data you want here is fine
});

Schema::create('roles', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
});

Schema::create('membership_role', function (Blueprint $table) {
    $table->unsignedBigInteger('membership_id');
    $table->unsignedBigInteger('role_id');
});
现在是Membership.php

class Membership extends Model
{
    public static function create(User $user, Team $team, array $roles = [])
    {
        $membership = new self();
        $membership->user_id = $user->id;
        $membership->team_id = $team->id;
        $membership->save();


        $attach = [];

        foreach ($roles as $role) {
            $attach[] = Role::resolveId($role);
        }

        $membership->roles()->attach($attach);

        return $membership;
    }

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

    public function syncRoles(array $roles)
    {
        $sync = [];

        foreach ($roles as $role) {
            $sync[] = Role::resolveId($role);
        }

        $this->roles()->sync($sync);
    }
}
和Role.php

class Role extends Model
{
    const CLIENT = 'client';
    const EMPLOYEE = 'employee';
    const USER = 'user';

    public function memberships()
    {
        return $this->belongsToMany(Membership::class);
    }

    public static function resolveId()
    {
        if (is_int($role)) {
            return $role;
        }

        if (is_string($role)) {
            $role = Role::where('name', $role)->first();
        }


        return $role->id;
    }
}
现在,您可以假设其他类是以明显的关系实现的,并执行以下操作:

foreach($request->clients as $client)
{
    if (!isset($roleSync[$client])) {
        $roleSync[$client] = [];
    }

    $roleSync[$client][] = Role::CLIENT;
}

foreach($request->employees as $employee)
{
    if (!isset($roleSync[$employee])) {
        $roleSync[$employee] = [];
    }

    $roleSync[$employee][] = Role::EMPLOYEE;
}

foreach($request->users as $user)
{
    if (!isset($roleSync[$user])) {
        $roleSync[$user] = [];
    }

    $roleSync[$user][] = Role::USER;
}

$ids = array_keys($roleSync);
$users = User::with('membership.roles')
               ->whereIn('id', $ids)
               ->get();

foreach ($users as $user) {
    $roles = $roleSync[$user->id];
    $user->membership->syncRoles($roles)
}

好吧,所以我们不能这么做??好吧,不是同一行的多角色。我将这样保存
1-1-client
1-1-employee
1-1-user
2-1-user
。你是对的。嗯,那么首先,我需要解决这个问题?ie)将用户与团队关联的成员资格表、角色的角色表和角色与成员的成员资格表。我已经做了一个示例答案,应该对您有用。