我正在尝试在我的Laravel应用程序中进行查询,并且我想为查询使用常规结构。这个类要么使用Eloquent所以我需要找到一些完全原始的查询。
可能类似于Model::query($query);
。只有这不起作用。
答案 0 :(得分:45)
你可以试试这个:
// 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")));
在Laravel website上查看有关Raw-Expressions
的详情。
答案 1 :(得分:13)
使用DB::statement('your raw query here')
。希望这会有所帮助。
答案 2 :(得分:7)
我不认为你可以默认。我扩展了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);
}
}
答案 3 :(得分:5)
您可以使用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) {}
答案 4 :(得分:3)
老问题,已经回答,我知道。
但是,似乎没有人提到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中工作)
答案 5 :(得分:1)
使用与您正在处理的查询相关的口才模型。
执行以下操作:
some_command
答案 6 :(得分:0)
您可以通过编写
来缩短结果处理时间$objects = new Collection(array_map(function($entry) {
return (new static())->setRawAttributes((array) $entry, true);
}, $result));
答案 7 :(得分:0)
如果要选择信息DB::select(Statement goes here)
,请记住,除非您转到Config / Database.php并设置连接= mysql,否则请确保某些查询不起作用,请确保'strict'= false
只知道它会引起一些安全问题
答案 8 :(得分:0)
如果你可能也需要这个。 orderByRaw() 函数用于您的订单。
喜欢
<块引用>WodSection::orderBy('score_type')
->orderByRaw('FIELD(score_type,"score_type") DESC')
->get();