Как вы опрашиваете ребенка и родителя в Laravel Eloquent - PullRequest
0 голосов
/ 08 октября 2018

Я хочу выяснить, как сделать запрос, чтобы получить результат, который был создан текущим пользователем или родителем текущего пользователя.

У меня есть две таблицы users и workouts.В обеих таблицах есть столбец created_by, в котором хранится идентификатор пользователя, который создал упомянутого пользователя или запись о тренировке.

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');
}

Я хочу выяснить, как я могу запросить поиск тренировки с использованием идентификатора, но только для тренировок, созданных текущим пользователем или создателем текущего пользователя.Ниже приведена логика текущего маршрута, которая возвращает только тренировки, созданные текущим пользователем.

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

1 Ответ

0 голосов
/ 08 октября 2018

В этом случае я, вероятно, не буду использовать красноречивые отношения, поскольку это могут быть либо пользователи id, либо их значение created_by.

Вместо этого я бы изменил метод в вашей модели пользователя.читать:

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

Затем вы можете сделать $user->createdWorkouts(), который вернет вам коллекцию всех тренировок, где он был создан пользователем или создан пользователем, который создал пользователя.

Поскольку это коллекция, у вас есть доступ ко всем другим методам в коллекции, таким как find и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...