带保留键的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)将用户与团队关联的成员资格表、角色的角色表和角色与成员的成员资格表。我已经做了一个示例答案,应该对您有用。