Разрешить отношения laravel, только если условие выполнено - PullRequest
0 голосов
/ 20 февраля 2019

Я отредактировал вопрос, так как моя первая попытка полностью вводила в заблуждение.Извините за это.

Я строю API с Laravel и имею следующие модели / таблицы:

user
---
id
name

customers
---
id
name
user_id

projects
---
id
name
user_id
customer_id (can be NULL)

Проект всегда принадлежит пользователю и, опционально, может также принадлежатьклиент.Клиент всегда принадлежит пользователю.Например:

users = [
    {id: 1, name: "user1"},
    {id: 2, name: "user2"}
]

customers = [
    {id: 1, name: "c1", user_id: 1},
    {id: 2, name: "c2", user_id: 1},
    {id: 3, name: "c3", user_id: 2}
]

projects = [
    {id: 1, name: "p1", user_id: 1},
    {id: 2, name: "p2", user_id: 1, customer_id: 1},
    {id: 3, name: "p3", user_id: 2, customer_id: 2}
]

Как предотвратить создание кем-либо недействительных данных в БД путем создания или обновления проекта с помощью customer_id, который принадлежит клиенту другого пользователя, а затем user_id проекта,Например:

newProject = {id: 4, name: "p4", user_id: 1, customer_id: 3}

Как видите, новый проект должен принадлежать пользователю 1и клиент 3, что невозможно.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Полагаю, вам необходимо зарегистрировать политику .Для этого следуйте инструкциям на странице документации, связанной с этим, затем в свой метод политики включите следующее:

public function update(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

и

public function create(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

Это заставит его работать на create иupdate методы.

Важная часть, которую следует отметить здесь:

return $customer->user_id === $user->id;

Это обеспечит, что для заданных customer и user, user_id наклиент соответствует id на user, что вы и хотите.

Чтобы заставить его работать на модели Projects, вам нужно будет сделать это в сервис-провайдере аутентификации:

class AuthServiceProvider extends ServiceProvider
{

protected $policies = [
    Project::class => ProjectPolicy::class,
];

Где ProjectPolicy - это имя политики, которую вы устанавливаете, когда делаетеphp artisan make:policy (как объяснено в связанных документах).

0 голосов
/ 20 февраля 2019

Мой совет: не помещайте логику авторизации в модель, используйте для этого контроллер.

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

Вы действительно должны прочитать главу об авторизации в официальных документах laravel .

Обновление: в контроллере вы можете проверить, что пользователь, введенный пользователем, является одним из пользователей-пользователей, выМожно даже использовать проверку формы запроса, в случае, если возвращается ошибка.Для проверки вы можете см. Здесь .

0 голосов
/ 20 февраля 2019

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

Для этого:

  • Создайте правило, для этого есть генератор.Внутри определите логику вашего конкретного правила.Вот документация: https://laravel.com/docs/5.7/validation#custom-validation-rules
  • Создание запроса формы.для этого тоже есть генератор, и примените в нем свое правило.Вот документация: https://laravel.com/docs/5.7/validation#form-request-validation
  • Вставьте этот запрос в действие вашего контроллера.Если проверка не пройдена, код в вашем контроллере даже не будет выполнен, и Framework вернет HTTP-код ошибки 422.

Это способ Laravel.

0 голосов
/ 20 февраля 2019

Вы можете сделать это следующим образом.

 class User extends Eloquent {

        public function scopePopular($query)
        {
            return $query->where('votes', '>', 100);
        }

    }

Вы можете вызвать другой метод из вашей модели, если оно истинно, тогда вы можете отправить его на контроллер.

Для Больше Области запросов

Надеюсь, это будет полезно для вас:)

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