Laravel: предоставить всем пользователям выходные дни в определенный месяц года

У меня есть модели 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 каждого пользователя)

извините, вы имеете в виду, что вам нужна коллекция пользователей, которые (например) dayoff есть 2024 или dayoff есть April с коллекцией holidays в 2024 или April ?

Hoseain Sanadgol 20.02.2024 08:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
128
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

вы можете использовать «whereHas»

$dayoff = Carbon::today();
User::whereHas('holidays', function ($q) use ($dayoff) {
            $q->where('dayoff', $dayoff);
        })->get();

Добро пожаловать, да, ваш код лучше подходит для вашего вопроса. теперь у тебя все еще есть проблемы?

Hoseain Sanadgol 19.02.2024 14:11

Чтобы получить всех пользователей с указанием их отпусков за определенный месяц и год:

 // 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();

Чистый плагиат того, что я сказал, что это не работает

Billal Begueradj 19.02.2024 18:01

@BillalBegueradj Я не могу найти источник. Если вы еще этого не сделали, перейдите в раздел «Пометить» -> выберите «Плагиат» и укажите, откуда происходит этот контент и почему вы считаете его плагиатом.

VLAZ 19.02.2024 18:13

Скопируйте/вставьте из моего вопроса (раздел редактирования). Помечен @VLAZ

Billal Begueradj 19.02.2024 18:40

@BillalBegueradj Я не вижу ничего скопированного/вставленного. Это похоже, но явно не то же самое. Порядок вызовов методов ->whereMonth('dayoff', '=', $month)->whereYear('dayoff', '=', $year); отличается, как и передаваемые в них параметры. User::with отличается от вашего User::whereHas, а ваш 'holidays', function (Builder $query) use ($year, $month) отличается от ассоциативного массива, использованного в ответе. Более того, я сомневаюсь, что код в вашем вопросе вообще считается «оригинальным», учитывая, что вы сказали, что переписали его.

VLAZ 19.02.2024 18:47

В этом вы правы User::with. Но >whereMonth('dayoff', '=', $month) это то же самое, что >whereMonth('dayoff', $month), и он заменил function (Builder $query) из ответа другого участника (на основании которого я отредактировал свой пост). Мой пост был отредактирован за несколько часов до этого ответа @VLAZ

Billal Begueradj 19.02.2024 18:53

@BillalBegueradj, какой плагиат, пожалуйста, проверьте мой код и сравните со своим.

Kwenziwa Lizwi Khanyile 19.02.2024 22:19

@KwenziwaLizwiKhanyile, единственная разница, которую ты сделал, это User::with. Две другие вещи, которые вы сделали, являются синонимами. Это как я говорю: «Я иду в школу», а вы говорите: «Я иду в школу». К тому же я писал, что этот путь не для изучения

Billal Begueradj 20.02.2024 05:26

вместо этого вы можете использовать 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()

Hoseain Sanadgol 20.02.2024 13:35

это: $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(‌​)

Hoseain Sanadgol 20.02.2024 13:38

нет проблем, но я не могу найти синтаксическую ошибку, просто добавьте ; в конце :)

Hoseain Sanadgol 20.02.2024 13:55
Ответ принят как подходящий

Правильный способ получить список пользователей и связанных с ними праздников:

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, я удалила, и все работает. Он автоматически группировал праздники каждого пользователя, как я и хотел. Большое спасибо

Billal Begueradj 20.02.2024 14:09

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