【问题标题】:fetch data for all users in same group为同一组中的所有用户获取数据
【发布时间】:2019-09-28 00:37:12
【问题描述】:

我的代码有效。但我不确定这是否是最佳解决方案。我需要显示用户玩家和/或用户所属组的玩家的选项。谢谢你的时间。


$user = $request->user();
$userGroups = $user->groups;
$friendsPlayers = [];

foreach ($userGroups as $group) {

    $groupUsers = $group->users;

    foreach ($groupUsers as $groupUser) {

        if ($groupUser->id !== $user->id) {

            $userPlayer = $groupUser->players;

            foreach ($userPlayer as $player) {

                if (!in_array($player, $friendsPlayers)) {

                    $friendsPlayers[] = $player;
                }
            }
        }
    }
}

1.Schema//////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////

 Schema::create('groups', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('info');
        $table->timestamps();
    });

 Schema::create('players', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned()->index();
        $table->string('name');
        $table->string('url');
        $table->string('type');
        $table->integer('wins');
        $table->integer('lost');
        $table->integer('draws');
        $table->timestamps();
    });

   Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
 Schema::create('group_user', function (Blueprint $table) {

        $table->integer('group_id')->unsigned()->nullable();
        $table->foreign('group_id')->references('id')
              ->on('groups')->onDelete('cascade');

        $table->integer('user_id')->unsigned()->nullable();
        $table->foreign('user_id')->references('id')
              ->on('users')->onDelete('cascade');
        $table->timestamps();
    });

2.型号///////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////

 class Group extends Model
 {
 protected $fillable = [
    'name', 'info',
 ];
 public function users() {
    return $this->belongsToMany(User::class);
 }
 }


 class Player extends Model
 {   
 protected $guarded = [];


public function user() {
        return $this->belongsTo(User::class);
}
public function leagues() {
    return $this->belongsToMany(League::class)->withPivot('win', 'lost', 
'draw')->withTimestamps();
}


class User extends Authenticatable
{
use Notifiable;


protected $fillable = [
    'name', 'email', 'password',
];


protected $hidden = [
    'password', 'remember_token',
];
public function players() {
    return $this->hasMany(Player::class);
}
public function leagues() {
    return $this->hasMany(League::class);
}
 public function scoreboards() {
    return $this->hasMany(Scoreboard::class);
 }
 public function groups() {
    return $this->belongsToMany(Group::class);
 }
 }

【问题讨论】:

  • 如果您不提供表格的结构,很难帮助您。
  • 能分享一下模型名和表结构吗

标签: php laravel eloquent relationship


【解决方案1】:

这可能是使用 Laravel Collection 的完美用例。

$result = $user->load('groups.groupUsers.players')
    ->groups
    ->map->groupUsers
    ->collapse()
    ->filter(function ($groupUser) use ($user) {
        return $groupUser->isNot($user);
    })
    ->unique('id')
    ->map->players
    ->collapse()
    ->unique('id');

另一种方法是使用查询来获取结果。

首先,让我们创建一个子查询来获取用户加入的所有组。

$groupsJoinedByUser = Group::whereHas('users', function ($query) use ($user) {
    $query->whereKey($user->id);
});

我们也可以这样创建子查询:

$groupsJoinedByUser = Group::select('groups.*')
    ->join('group_user', 'groups.id', '=', 'group_user.group_id')
    ->where('group_user.user_id', $user->id);

现在我们可以创建查询来获取玩家:

$players = Player::select('players.*')
    ->join('users', 'players.user_id', '=', 'users.id')
    ->join('group_user', 'users.id', '=', 'group_user.user_id')
    ->joinSub($groupsJoinsByUser, 'groups_joined_by_user', function($join) {
        $join->on('group_user.group_id', '=', 'groups_joined_by_user.id')
    })
    ->where('users.id', '!=', $user->id);
    ->distinct()
    ->get();

【讨论】:

  • 你能解释一下 $user->load('groups.groupUsers.players') 部分吗?
  • 我在这里找到了答案stackoverflow.com/questions/26005994/…
  • 我已经根据数据库架构更新了我的答案。
  • 非常感谢您的回答。没想到一个问题就能收获这么多。我正在探索这两种方法。这么多的可能性:) :)
  • 仍然有问题 ->join($groupsJoinsByUser, 'groups_joined_by_user', function($join) { $join->on('group_user.group_id', '=', 'groups_joined_by_user.id ') }) 我做了一些更改 ->join($groupsJoinedByUser, 'groups_joined_by_user', function($join) { $join->on('group_user.group_id', '=', 'groups_joined_by_user.id'); })但它仍然无法正常工作。得到一个错误期望参数 1 是字符串,给定对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2023-03-21
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多