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

3

我有三个数组。

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

我如何获得像上面那样的结果?

这是针对Laravel带有额外列的多对多同步的。

谢谢。


那么,我们不能这样做吗? - LoveCoding
不同的角色不能在同一行。我将保存为1-1-client1-1-employee1-1-user2-1-user等。 - LoveCoding
你说得对。嗯,那么首先,我需要解决这个问题吗?https://dev59.com/8Lzpa4cB1Zd3GeqPIEx7#63008422 - LoveCoding
1
成员表将用户与团队相关联,角色表用于角色,成员角色表用于角色到成员的关联。 - Kurt Friars
正在检查中,谢谢! - LoveCoding
显示剩余4条评论
1个回答

1
在与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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接