web-dev-qa-db-ja.com

Eloquent経由でrawクエリを実行するにはどうすればよいですか?

Laravelアプリでクエリを実行しようとしていますが、クエリに通常の構造を使用したいと思います。 。

Model::query($query);のようなものかもしれません。それだけでは機能しません。

23
Chilion

DB::statement('your raw query here')を使用します。お役に立てれば。

13
Ray

これを試すことができます:

// 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サイト

49
The Alpha

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) {}
_
8

デフォルトではできないと思います。 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);
     }
 }
8
Matthijn

古い質問、すでに答えられた、私は知っています。

ただし、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)で動作します)

4
cartbeforehorse

書くことで結果処理を短縮できます

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