Несколько условий в отношениях Ларавелла - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть две таблицы: одна - таблица пользователей, а другая - таблица бронирования (в основном это приложение для бронирования билетов).

Таблица пользователей:

userid    usertype
  01      normal
  02      agent
  03      normal
  ...      ...

И в таблице заказов:

bookingid    userid    createdAt    updatedAt
   01         01       01-09-2018   17-09-2018
   02         03       31-08-2018   12-09-2018
  ...        ...          ...          ...

Что мне нужно сделать, так это отфильтровать общее количество заказов, сделанных пользователем и агентом за сегодняшний день (особенно сегодня). Поэтому я установил связь между пользователем и таблицей бронирования следующим образом:

public function users()
{
    return $this->belongsTo('App\User', 'userid');
}

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

public function bookings()
{
    return $this->hasMany('App\Booking', 'userid');
}

Теперь мне нужно получить общее количество бронирований за сегодня, отфильтровав usertype как обычный и агент. Например - общее количество бронирований, выполненных сегодня (в таблице бронирования) пользователем или агентом (проверяя идентификатор пользователя из таблицы бронирования, мне нужно определить, является ли его агент или обычный пользователь), чтобы я мог получить количество билетов, забронированных обычным пользователем а также агенты.

Код контроллера, который я использовал:

$booking = Booking::all();
$users = User::all();
$ticketUserToday = Booking::with('users')->get()->where(['usertype','=','agent'],['createdAt','>=',Carbon::Today()]);

Но я получаю null значение, когда дд.

1 Ответ

0 голосов
/ 17 сентября 2018

Использование ->get() с последующим ->where() - это не то же самое, что запрос к базе данных;он попытается отфильтровать Collection из Bookings, полученного из Booking::get(), поэтому вы получаете null;он не может фильтроваться должным образом из-за другой сигнатуры функции ->where() между классами Builder и Collection.

То, что вам нужно, это ->whereHas() на вашем Usersроль и ->where() в вашей таблице Booking:

$ticketsToday = Booking::with(["users"])
->where("createdAt", ">=", Carbon::today())
->whereHas("users" => function($subQuery){ 
   $subQuery->where("usertype", "=", "agent");
})->get();

Для этого нужно запросить в таблице Booking правильную дату, а затем ограничить результат тем, у которого одна или несколькоUsers с usertype «агентом».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...