Разница между DB :: raw и selectRaw - PullRequest
0 голосов
/ 17 мая 2018

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

User::withCount([
    'points' => function ($q) {
        $q->select(DB::raw("SUM(points)"));
    },
])

Но когда я использую selectRaw("SUM(points)") вместо select(DB::raw("SUM(points)")), Laravel возвращает количество строк, а не сумму,Это как если бы функция вообще не запускалась.Что дает?

Вот запросы MySQL, сделанные Eloquent

  #With DB::raw
    "select `users`.*, (select SUM(points) from `user_points` where `users`.`user-id` = `user_points`.`user-id`) as `points_count` 
    from `users` 
    order by `points_count` desc"

    #With selectRaw
    "select `users`.*, (select count(*) from `user_points` where `users`.`user-id` = `user_points`.`user-id`) as `points_count` 
    from `users` 
    order by `points_count` desc"

Почему DB::raw и selectRaw возвращают разные результаты с примером выше?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы получаете разные запросы, потому что select() заменяет выбранные столбцы, а selectRaw() добавляет выбранный столбец.

Таким образом select(DB::raw('SUM(points)')) заменяет значение по умолчаниюcount(*).

0 голосов
/ 17 мая 2018

Они почти одинаковы, но selectRaw допускает привязки. глядя на исходный код:

// Line 232, /Illuminate/Database/Query/Builder.php
public function selectRaw($expression, array $bindings = [])
{
    $this->addSelect(new Expression($expression));
    if ($bindings) {
        $this->addBinding($bindings, 'select');
    }
    return $this;
}

// Line 835 /Illuminate/Database/Connection.php
public function raw($value)
{
    return new Expression($value);
}

На основании сигнатур метода

// You can do bindings with selectRaw()
->selectRaw('complex_thing(column_name, ?)', [123]);

// but there's not a way to do bindings with DB::raw()
->select(DB::raw('no_bindings_allowed('fixed', 'values', 42)');

Вы можете вручную вставить значение в строку DB::raw() выше, но вам необходимо проверить, чтобы убедиться, что внедрение кода невозможно. Надеюсь, вы понимаете.

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