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.
benutze DB::statement('your raw query here')
. Hoffe das hilft.
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 .
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);
}
}
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) {}
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)
Sie können Ihre Ergebnisbehandlung durch Schreiben verkürzen
$objects = new Collection(array_map(function($entry) {
return (new static())->setRawAttributes((array) $entry, true);
}, $result));