webentwicklung-frage-antwort-db.com.de

Wie kann ich Raw über Eloquent abfragen?

Ich versuche, eine Abfrage in meiner Laravel-App durchzuführen, und ich möchte eine normale Struktur für meine Abfrage verwenden. Diese Klasse verwendet entweder Eloquent, daher muss ich etwas finden, um eine Abfrage vollständig auszuführen.

Könnte so etwas wie Model::query($query); sein. Nur das geht nicht.

20
Chilion

benutze DB::statement('your raw query here'). Hoffe das hilft.

14
Ray

Sie können dies versuchen:

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

Ein Beispiel:

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

Sie können auch so etwas verwenden (Query Builder verwenden):

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

Möglicherweise versuchen Sie Folgendes (Verwenden des Abfrage-Generators):

$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")));

Mehr über Raw-Expressions auf Laravel-Website .

42
The Alpha

Ich glaube nicht, dass Sie dies standardmäßig tun können. Ich habe Eloquent erweitert und die folgende Methode hinzugefügt.

/**
 * 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);
}

Sie können dann so etwas tun:

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);
     }
 }
6
Matthijn

Sie können die Funktion hydrate() verwenden, um Ihr Array in die Eloquent-Modelle zu konvertieren, die Laravel selbst intern verwendet, um die Abfrageergebnisse in die Modelle zu konvertieren. Soweit ich weiß, wird es in den Dokumenten nicht erwähnt.

Der folgende Code entspricht $userModels = User::where('id', '>', $userId)->get();:

$userData = DB::select('SELECT * FROM users WHERE id > ?', [$userId]);
$userModels = User::hydrate($userData);

Die Funktion hydrate() ist in \Illuminate\Database\Eloquent\Builder definiert als:

/**
 * Create a collection of models from plain arrays.
 *
 * @param  array  $items
 * @return \Illuminate\Database\Eloquent\Collection
 */
public function hydrate(array $items) {}
3

Alte Frage, schon beantwortet, ich weiß.

Die Expression-Klasse scheint jedoch niemand zu erwähnen.

Zugegebenermaßen wird das Problem dadurch möglicherweise nicht behoben, weil Ihre Frage mehrdeutig macht, wo in der SQL die Raw-Bedingung enthalten sein muss (in der SELECT-Anweisung oder in der WHERE-Anweisung). Diese Informationen können jedoch trotzdem nützlich sein.

Fügen Sie der Modelldatei die folgende Klasse hinzu:

use Illuminate\Database\Query\Expression;

Dann definieren Sie in der Klasse Model eine neue Variable

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'
]

Und fügen Sie einen Bereich hinzu:

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

Dann rufen Sie von Ihrem Controller oder Ihrer Logikdatei aus einfach Folgendes auf:

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

Glückliche Tage.

(Funktioniert in Laravel Framework 5.5)

3
cartbeforehorse

Sie können Ihre Ergebnisbehandlung durch Schreiben verkürzen

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