Проверьте, существует ли UUID в таблице A или таблице B, используя правила проверки (проверка Laravel)?

В моем приложении Laravel я хотел бы проверить, присутствует ли значение поля uuid в таблице courses или в таблице contingents, используя правила проверки. Чтобы продолжить, UUID должен присутствовать в одной из двух таблиц. Laravel требует, чтобы UUID присутствовал в обеих таблицах, когда я применяю следующий набор правил:

$request->validate([
   'uuid' => 'exists:courses,course_id',
   'uuid' => 'exists:contingents,contingent_id
]);

Требуется некая «логика дифференциации». Этого можно было бы добиться с помощью некоторых операторов if, но я думаю, что это будет не очень чистый способ решения проблемы.

Как я могу сказать Laravel, что UUID должен существовать только в ОДНОЙ таблице, чтобы проверка прошла нормально?

Заранее спасибо.

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

BugHunter 08.07.2024 14:03

Да, это должно быть индивидуальное правило. Как написано ['uuid' => '...', 'uuid' => '...'], проверяется только вторая логика exists, поскольку ключи массива должны быть уникальными, а если они не уникальны, приоритет имеет «последний». Однако документация для пользовательских правил довольно хороша: laravel.com/docs/11.x/validation#custom-validation-rules

Tim Lewis 08.07.2024 14:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
96
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

use Illuminate\Support\Facades\DB;    

$request->validate([
    'uuid' => [
        'required',
        function ($attribute, $value, $fail) {
            $courseExists = DB::table('courses')->where('course_id', $value)->exists();
            $contingentExists = DB::table('contingents')->where('contingent_id', $value)->exists();

            if (!$courseExists && !$contingentExists) {
                $fail('The :attribute must exist in either the courses or contingents table.');
            }
        },
    ],
]);

вы можете использовать собственное правило проверки прежде всего создайте новое правило, используя php artisan make:rule ruleName. теперь напишите эту функцию в классе правил

public function passes($attribute, $value)
{
    // Check if the UUID exists in either courses or contingents table
    $existsInCourses = DB::table('courses')->where('course_id', $value)->exists();
    $existsInContingents = DB::table('contingents')->where('contingent_id', $value)->exists();

    return $existsInCourses || $existsInContingents;
}

после этого используйте его в своем контроллере вот так

use App\Rules\RuleName;

// Inside your controller method
$request->validate([
   'uuid' => ['required', new RuleName],
]);
Ответ принят как подходящий

вы можете создать собственное правило проверки, используя php artisan make:rule ticketNumberIsNotUsed

class TicketNumberIsNotUsed implements Rule
{
  public function __construct(protected array $tables = [])
  {}

  public function passes($attribute, $value)
  {
    // Check if the UUID exists in either of the tables
    foreach ($this->tables as $table => $field) {
      if (DB::table($table)->where($field, $value)->exists()) {
        return true;
      }
    }

    return false;
  }
...
use App\Rules\TicketNumberIsNotUsed;

$request->validate([
   'uuid' => ['required', new TicketNumberIsNotUsed([
     // list of table => field to search in order
     'courses' => 'course_id',
     'contingents' => 'contingent_id',
    ])],
]);

Мне нравится абстракция, и ваш ответ — единственный ответ, который приводит к короткому замыканию, если запись найдена в первой таблице (т. е. лучшая производительность). Хорошая штука 🙂

Tim Lewis 08.07.2024 17:52

Отличное решение, большое спасибо!

Gentlebeer ツ 12.07.2024 00:04

Другие вопросы по теме