У меня есть модели User и Holiday, связанные следующим образом:
Модель пользователя:
class User extends Authenticatable
{
public function holidays(): HasMany
{
return $this->hasMany(Holiday::class);
}
Праздничная модель:
class Holiday
{
protected $fillable = [
'dayoff', // DATE YYYY-MM-DD
'user_id',
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
Учитывая $month и $year, я хотел бы получить информацию обо всех пользователях и связанных с ними праздниках (dayoff).
Как я могу этого добиться?
Редактировать:
Я переписал ответ ниже таким образом:
use Illuminate\Database\Eloquent\Builder;
$users = User::whereHas('holidays', function (Builder $query) use ($year, $month) {
$query->whereYear('dayoff', $year)->whereMonth('dayoff', $month);
})->get();
Но это дает список пользователей без связанных с ними праздников (список dayoff каждого пользователя)






вы можете использовать «whereHas»
$dayoff = Carbon::today();
User::whereHas('holidays', function ($q) use ($dayoff) {
$q->where('dayoff', $dayoff);
})->get();
Добро пожаловать, да, ваш код лучше подходит для вашего вопроса. теперь у тебя все еще есть проблемы?
Чтобы получить всех пользователей с указанием их отпусков за определенный месяц и год:
// Assuming $month and $year are passed as query parameters
$month = $request->query('month');
$year = $request->query('year');
// Retrieve all users with their holidays for the specified month and year
$users = User::with(['holidays' => function ($query) use ($month, $year) {
$query->whereMonth('dayoff', '=', $month)
->whereYear('dayoff', '=', $year);
}])->get();
Чистый плагиат того, что я сказал, что это не работает
@BillalBegueradj Я не могу найти источник. Если вы еще этого не сделали, перейдите в раздел «Пометить» -> выберите «Плагиат» и укажите, откуда происходит этот контент и почему вы считаете его плагиатом.
Скопируйте/вставьте из моего вопроса (раздел редактирования). Помечен @VLAZ
@BillalBegueradj Я не вижу ничего скопированного/вставленного. Это похоже, но явно не то же самое. Порядок вызовов методов ->whereMonth('dayoff', '=', $month)->whereYear('dayoff', '=', $year); отличается, как и передаваемые в них параметры. User::with отличается от вашего User::whereHas, а ваш 'holidays', function (Builder $query) use ($year, $month) отличается от ассоциативного массива, использованного в ответе. Более того, я сомневаюсь, что код в вашем вопросе вообще считается «оригинальным», учитывая, что вы сказали, что переписали его.
В этом вы правы User::with. Но >whereMonth('dayoff', '=', $month) это то же самое, что >whereMonth('dayoff', $month), и он заменил function (Builder $query) из ответа другого участника (на основании которого я отредактировал свой пост). Мой пост был отредактирован за несколько часов до этого ответа @VLAZ
@BillalBegueradj, какой плагиат, пожалуйста, проверьте мой код и сравните со своим.
@KwenziwaLizwiKhanyile, единственная разница, которую ты сделал, это User::with. Две другие вещи, которые вы сделали, являются синонимами. Это как я говорю: «Я иду в школу», а вы говорите: «Я иду в школу». К тому же я писал, что этот путь не для изучения
вместо этого вы можете использовать left join, поэтому:
$month = $request->query('month');
$year = $request->query('year');
$users = User::leftJoin('holidays', function ($q) use ($month, $year) {
$q->on('holidays.user_id', '=', 'users.id')
->whereMonth('dayoff', '=', $month)
->whereYear('dayoff', '=', $year);
})->select('users.*', 'holidays.dayoff')
->whereNotNull('holidays.dayoff')->get();
просто используйте ->groupBy('users.id') перед ->get()
это: $users = User::leftJoin('holidays', function ($q) use ($month, $year) { $q->on('holidays.user_id', '=', 'users.id') ->whereMonth('dayoff', '=', $month) ->whereYear('dayoff', '=', $year); })->select('users.*', 'holidays.dayoff') ->whereNotNull('holidays.dayoff')->groupBy('users.id')->get()
нет проблем, но я не могу найти синтаксическую ошибку, просто добавьте ; в конце :)
Правильный способ получить список пользователей и связанных с ними праздников:
use Illuminate\Database\Eloquent\Builder;
$users = User::query()
//this will filter the users depending on the condition of the relation
->whereHas('holidays', function (Builder $query) use ($year, $month) {
$query->whereYear('dayoff', $year)->whereMonth('dayoff', $month);
})
//this will get the relation depending on the conditions
->with(['holidays' => function (Builder $query) use ($year, $month) {
$query->whereYear('dayoff', $year)->whereMonth('dayoff', $month);
}])
->get();
В результате вы получите коллекцию пользовательских моделей и в каждой из них атрибут (отношение) «праздники», содержащий коллекцию моделей праздников, удовлетворяющих условию.
Один (whereHas()) предназначен для фильтрации по отношению, а другой (with()) — для получения указанного отношения.
Очень красиво и чисто :) Мне только что поступила небольшая жалоба Builder, я удалила, и все работает. Он автоматически группировал праздники каждого пользователя, как я и хотел. Большое спасибо
извините, вы имеете в виду, что вам нужна коллекция пользователей, которые (например)
dayoffесть2024илиdayoffестьAprilс коллекциейholidaysв2024илиApril?