Как я могу запросить raw через Eloquent?

Я пытаюсь выполнить запрос в своем приложении Laravel, и я хочу использовать обычную структуру для моего запроса. Этот класс либо использует Eloquent, поэтому мне нужно найти что-то, чтобы сделать запрос полностью сырым.

Может быть что-то вроде Model::query($query);. Только это не работает.

Ответ 1

используйте DB::statement('your raw query here'). Надеюсь, это поможет.

Ответ 2

Вы можете попробовать следующее:

// query can't be select * from table where
Model::select(DB::raw('query'))->get();

Пример:

Model::select(DB::raw('query'))
     ->whereNull('deleted_at')
     ->orderBy('id')
     ->get();

Кроме того, вы можете использовать что-то вроде этого (с помощью Query Builder):

$users = DB::table('users')
                 ->select(DB::raw('count(*) as user_count, status'))
                 ->where('status', '<>', 1)
                 ->groupBy('status')
                 ->get();

Кроме того, вы можете попробовать что-то вроде этого (с помощью Query Builder):

$users = DB::select('select * from users where id = ?', array(1));
$users = DB::select( DB::raw("select * from users where username = :username"), array('username' => Input::get("username")));

Подробнее о Raw-Expressions на веб-сайте Laravel.

Ответ 3

Я не думаю, что вы можете по умолчанию. Я расширил Eloquent и добавил следующий метод.

/**
 * Creates models from the raw results (it does not check the fillable attributes and so on)
 * @param array $rawResult
 * @return Collection
 */
public static function modelsFromRawResults($rawResult = [])
{
    $objects = [];

    foreach($rawResult as $result)
    {
        $object = new static();

        $object->setRawAttributes((array)$result, true);

        $objects[] = $object;
    }

    return new Collection($objects);
}

Затем вы можете сделать что-то вроде этого:

class User extends Elegant { // Elegant is my extension of Eloquent

     public static function getWithSuperFancyQuery()
     {
         $result = DB::raw('super fancy query here, make sure you have the correct columns');
         return static::modelsFromRawResults($result);
     }
 }

Ответ 4

Вы можете сократить обработку результатов, написав

$objects = new Collection(array_map(function($entry) {
    return (new static())->setRawAttributes((array) $entry, true);
}, $result));

Ответ 5

Старый вопрос, уже ответил, я знаю.

Однако никто не упоминает класс Expression.

Конечно, это может не исправить вашу проблему, потому что ваш вопрос оставляет его двусмысленным относительно того, где в SQL должно быть включено условие Raw (это в инструкции SELECT или в инструкции WHERE?). Тем не менее, эта часть информации, которую вы можете найти полезной независимо.

Включите следующий класс в файл модели:

use Illuminate\Database\Query\Expression;

Затем внутри класса Model определите новую переменную

protected $select_cols = [
    'id', 'name', 'foo', 'bar',
    Expression ('(select count(1) from sub_table where sub_table.x = top_table.x) as my_raw_col'), 'blah'
]

И добавьте область действия:

public function scopeMyFind ($builder, $id) {
    return parent::find ($id, $this->select_cols);
}

Затем из вашего контроллера или логического файла вы просто вызываете:

$rec = MyModel::myFind(1);
dd ($rec->id, $rec->blah, $rec->my_raw_col);

Счастливые дни.

(Работает в рамках Laravel 5.5)