Как использовать Laravel Query Builder с предложением Where и в PHP? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь убедиться, что запись существует в базе данных перед выполнением действий, связанных с пользователем.Когда я выполняю запрос непосредственно в моем PHPMyAdmin, вот так (для целей тестирования).

SELECT * FROM `chat_participants` WHERE `chat_id` = 2 AND `user_id` = 2

Я получаю правильную запись.Тем не менее, когда я пытаюсь использовать Laravel Query Builder для достижения того же.

dd($this->participants
    ->where('chat_id', '=', 2)
    ->where('user_id', '=', 2)
    ->get()
    ->first());

Я получаю null. Есть ли способ убедиться, что запись существует в базе данных с помощью Query Builder?Нужно ли объявлять AND в построителе запросов?

Обновление: я установил переменную participants в своем конструкторе.

public function __construct()
{
    $this->middleware('auth');
    $this->header = DB::table('chat_headers');
    $this->participants = DB::table('chat_participants');
    $this->messages = DB::table('chat_messages');
}

toSql () создает:

select * from chat_participants` 
    inner join chat_headers on chat_headers.id = chat_participants.chat_id 
    inner join chat_rbac on chat_rbac.id = chat_participants.rbac 
 where chat_participants.chat_id = ? and chat_participants.user_id = ? 
    and chat_id = ? and user_id = ?

1 Ответ

0 голосов
/ 29 января 2019

Объекты передаются по ссылке в PHP, это означает, что вы передаете указатель на один и тот же объект Query Builder везде, где используете свойство participants.Так что в большинстве случаев вам нужно создавать новый объект построителя запросов для каждого запроса.

Однако PHP допускает клонирование объектов, что позволит вам передать базовый построитель запросов и начать заново везде вы используете его:

$query = clone $this->participants;
$query->where(..)->first();

Это реализация шаблона OO Prototype, создание базового объекта, а затем создание его копии для выполнения спецификаций.

Это был бы единственный способ избежать жесткого кодирования имени таблицы везде, где вы ее запрашиваете.

...