Laravelアプリでクエリを実行しようとしていますが、クエリに通常の構造を使用したいと思います。 。
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();
また、次のようなものを使用することもできます(クエリビルダを使用):
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
また、次のようなものを試すこともできます(クエリビルダを使用):
$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
on Laravel Webサイト 。
hydrate()
関数を使用して、配列をEloquentモデルに変換できます。このモデルは、Laravel
自体内部を使用してクエリ結果をモデルに変換します。私の知る限り、ドキュメントには記載されていません。
以下のコードは$userModels = User::where('id', '>', $userId)->get();
と同等です:
_$userData = DB::select('SELECT * FROM users WHERE id > ?', [$userId]);
$userModels = User::hydrate($userData);
_
hydrate()
関数は_\Illuminate\Database\Eloquent\Builder
_で次のように定義されています:
_/**
* Create a collection of models from plain arrays.
*
* @param array $items
* @return \Illuminate\Database\Eloquent\Collection
*/
public function hydrate(array $items) {}
_
デフォルトではできないと思います。 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);
}
}
古い質問、すでに答えられた、私は知っています。
ただし、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 framework 5.5)で動作します)
書くことで結果処理を短縮できます
$objects = new Collection(array_map(function($entry) {
return (new static())->setRawAttributes((array) $entry, true);
}, $result));