Я пытаюсь сделать запрос в моем приложении Laravel, и я хочу использовать обычную структуру для моего запроса. Этот класс либо использует Eloquent, поэтому мне нужно найти что-то, чтобы сделать запрос полностью сырым.
Может быть что-то вроде Model::query($query);
, Только это не работает.
используйте DB::statement('your raw query here')
. Надеюсь это поможет.
Вы можете попробовать следующее:
// 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 .
Я не думаю, что вы можете по умолчанию. Я расширил 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); } }
Вы можете сократить обработку результатов, написав
$objects = new Collection(array_map(function($entry) { return (new static())->setRawAttributes((array) $entry, true); }, $result));
Старый вопрос, уже ответил, я знаю.
Однако никто не упоминает класс 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)