Я тренируюсь с отношениями «многие ко многим», и сегодня я пытаюсь сравнить 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() только квитанции, которые имеют одинаковые типы режимов. Итак, мне нужно сравнить две сводные таблицы:
Я прочитал документ и не нашел ничего, что мог бы использовать. Не могли бы вы мне помочь, пожалуйста?
Привет, KGG, я добавляю отношение своих моделей :)
пожалуйста, проверьте ответ ниже, если есть проблема с моделью Recette, укажите ее в основном сообщении. Также, если вам нужны дополнительные пояснения и разъяснения, дайте мне знать.






Я не уверен, какие данные у вас есть внутри "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 в функцию:/
На самом деле я использовал ту же идею, что и вы, я был сосредоточен на своей первой идее. Вместо $user был auth()->user()->id и это работает. Спасибо !
Я очень рад, что это сработало для вас @Karl, если у вас есть какие-либо вопросы в будущем, пожалуйста, не стесняйтесь спрашивать, если вам понравился ответ, пожалуйста, подумайте о том, чтобы оставить свой ответ на мой ответ, это было бы очень признательно.
Я пытался проголосовать за ваш ответ, я не уверен, что это сработало. Спасибо за вашу доброту ^^ Кстати, вчера я задал еще один вопрос на ту же тему, может быть, у вас тоже есть ответ ^^
Вы можете получить его с помощью whereHas()
$user = auth()->user();
$receipts = Recette::whereHas('regimes', function($query) use($user) {
$query->whereIn('regime_id', $user->regimes->pluck('id'));
})->get();
Я пробовал, тоже работает. Я оставлю это для следующего раза :)
Привет @Karl, добро пожаловать в стек, пожалуйста, опубликуйте свои модели (часть отношений), вы можете отредактировать свой исходный пост с дополнительными данными, и я покажу вам, как это сделать, используя стандартные методы.