Как сравнить 2 сводные таблицы в Laravel?

Я тренируюсь с отношениями «многие ко многим», и сегодня я пытаюсь сравнить 2 сводные таблицы.

Пробую сайт диетолога. С одной стороны, диетолог/администратор может создать карту пациента (моя таблица «Пользователь». В этих картах он сообщает тип режима этого пациента. Это отношение «многие ко многим», поэтому я сделал сводную таблицу «regime_user»).

Schema::create('regime_user', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->foreignId('regime_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->timestamps();
    });

С другой стороны, он может создавать квитанции (у меня таблица "Recette") и информирует о типе режима. Я снова использую сводную таблицу «recette_regime».

Schema::create('recette_regime', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->foreignId('recette_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->foreignId('regime_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
    });

Конечно, в моих моделях я добавил отношение: Для пользовательской модели:

public function regimes()
{
    return $this->belongsToMany(Regime::class);
}

Для модели режима:

 public function users()
{
    return $this->belongsToMany(User::class);
}

Что я хочу сделать сейчас в индексе квитанций, так это отображать для auth()->user() только квитанции, которые имеют одинаковые типы режимов. Итак, мне нужно сравнить две сводные таблицы:

  • какие типы режимов имеют auth()->user()
  • найти квитанции с одинаковыми типами режимов

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

Привет @Karl, добро пожаловать в стек, пожалуйста, опубликуйте свои модели (часть отношений), вы можете отредактировать свой исходный пост с дополнительными данными, и я покажу вам, как это сделать, используя стандартные методы.

KGG 26.12.2022 20:46

Привет, KGG, я добавляю отношение своих моделей :)

Karl 26.12.2022 21:03

пожалуйста, проверьте ответ ниже, если есть проблема с моделью Recette, укажите ее в основном сообщении. Также, если вам нужны дополнительные пояснения и разъяснения, дайте мне знать.

KGG 26.12.2022 21:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
3
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, какие данные у вас есть внутри "Regime & Recette", но в этом примере я предполагаю, что столбец name существует, чтобы показать концепцию того, как вы можете представить данные.

Модель пользователя:

public function regimes()
{
    return $this->belongsToMany(Regime::class);
}

Модель режима:

public function users()
{
    return $this->belongsToMany(User::class);
}

public function recettes()
{
    return $this->belongsToMany(Recette::class);
}

Рекет Модель:

public function regimes()
{
    return $this->belongsToMany(Regime::class);
}

В функции отображения UserController:

/**
 * Show the specified model.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  User $user
 * @return \Illuminate\Http\Response
 */
public function show(User $user){
    // This will lazy load all of the inner relationships:
    $user->load('regimes.recettes');
   
    // Return the view with the user
    return view('sampleView', compact('user')); 
}

В лезвии SampleView:

<!-- You call the regime relationship and display it !-->
@foreach($user->regimes as $regime)
    <ul>
        <li>ID: {{$regime->id}} - Name: {{$regime->name}}
            <ul>
                <!-- You call the recette relationship and display it !-->
                @forelse($regime->recettes as $recette)
                    <li>ID: {{$recette->id}} - Name: {{$recette->name}}</li>
                @empty
                    <li>No Data</li>
                @endforelse
            </ul>
        </li>       
    </ul>
@endforeach

Я могу попробовать это, но на самом деле это не функция показа, в которой я нуждаюсь, это индекс страницы recette. Когда гость или аутент зайдут на сайт, он будет находиться в индексе ресетов, и на этой странице гость увидит все ресеты, авторизация увидит только ресеты со своим типом режима. Поэтому я не могу передать $user в функцию:/

Karl 26.12.2022 21:59

На самом деле я использовал ту же идею, что и вы, я был сосредоточен на своей первой идее. Вместо $user был auth()->user()->id и это работает. Спасибо !

Karl 29.12.2022 12:35

Я очень рад, что это сработало для вас @Karl, если у вас есть какие-либо вопросы в будущем, пожалуйста, не стесняйтесь спрашивать, если вам понравился ответ, пожалуйста, подумайте о том, чтобы оставить свой ответ на мой ответ, это было бы очень признательно.

KGG 30.12.2022 04:56

Я пытался проголосовать за ваш ответ, я не уверен, что это сработало. Спасибо за вашу доброту ^^ Кстати, вчера я задал еще один вопрос на ту же тему, может быть, у вас тоже есть ответ ^^

Karl 30.12.2022 15:35

Вы можете получить его с помощью whereHas()

$user = auth()->user();

$receipts = Recette::whereHas('regimes', function($query) use($user) {
    $query->whereIn('regime_id', $user->regimes->pluck('id'));
})->get();

Я пробовал, тоже работает. Я оставлю это для следующего раза :)

Karl 29.12.2022 12:36

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