你如何在laravel雄辩中查询孩子和父母

时间:2018-10-08 15:04:51

标签: php laravel eloquent

我想弄清楚如何查询以获取由当前用户或当前用户父级创建的结果。

我有两个表usersworkouts。两个表都有一个created_by列,该列存储创建该用户或锻炼记录的人的用户ID。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `created_by` int(10) unsigned DEFAULT NULL,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `users_created_by_foreign` (`created_by`),
  CONSTRAINT `users_created_by_foreign` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`)
);

CREATE TABLE `workouts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `created_by` int(10) unsigned NOT NULL,
  `description` text COLLATE utf8_unicode_ci,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `workouts_created_by_foreign` (`created_by`),
  CONSTRAINT `workouts_created_by_foreign` FOREIGN KEY (`created_by`) REFERENCES `users` (`id`)
);

在我的用户模型中,我具有返回用户创建的所有锻炼的功能。

public function createdWorkouts(): HasMany
{
    return $this->hasMany(Workout::class, 'created_by');
}

我想弄清楚的是,如何查询使用ID查找锻炼,但仅适用于当前用户创建的锻炼或当前用户的创建者的锻炼。下面是我当前的路线逻辑,该逻辑仅返回当前用户创建的锻炼。

$user = User::find(1); // This would come from the JWT
if (!$workout = $user->createdWorkouts()->find($args[‘workout_id’])) {
    return $response->withJson([], 404);
}

1 个答案:

答案 0 :(得分:0)

在这种情况下,我可能不会使用雄辩的关系,因为它可能是用户id或他们的created_by值。

相反,我会将用户模型上的方法更改为:

public function createdWorkouts()
{
    return Workout::where('created_by', $this->id)->orWhere('created_by', $this->created_by)->get();
}

然后,您可以执行$user->createdWorkouts(),它将向您返回由用户创建或创建用户的用户创建的所有锻炼的集合。

由于它是一个集合,因此您可以访问集合上的所有其他方法,例如find