【发布时间】:2014-05-20 11:10:08
【问题描述】:
我正在尝试在我的 Laravel 应用程序中进行查询,并且我想为我的查询使用正常的结构。这个类要么使用 Eloquent,所以我需要找到一些东西来做一个完全原始的查询。
可能类似于Model::query($query);。只有这样是行不通的。
【问题讨论】:
标签: php laravel laravel-4 eloquent
我正在尝试在我的 Laravel 应用程序中进行查询,并且我想为我的查询使用正常的结构。这个类要么使用 Eloquent,所以我需要找到一些东西来做一个完全原始的查询。
可能类似于Model::query($query);。只有这样是行不通的。
【问题讨论】:
标签: php laravel laravel-4 eloquent
如果你也需要这个。 orderByRaw() 函数用于您的订单。
喜欢
WodSection::orderBy('score_type')
->orderByRaw('FIELD(score_type,"score_type") DESC')
->get();
【讨论】:
如果您想选择信息,它是DB::select(Statement goes here),请记住,除非您转到 Config/Database.php 并设置连接 = mysql,否则某些查询将不起作用,请确保 'strict' = false
只要知道它可能会引起一些安全问题
【讨论】:
使用与您正在处理的查询相关的Eloquent Model。
然后做这样的事情:
$contactus = ContactUS::select('*')
->whereRaw('id IN (SELECT min(id) FROM users GROUP BY email)')
->orderByDesc('created_at')
->get();
【讨论】:
您可以使用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) {}
【讨论】:
老问题,已经回答了,我知道。
但是,似乎没有人提到 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 中工作)
【讨论】:
您可以通过编写来缩短结果处理
$objects = new Collection(array_map(function($entry) {
return (new static())->setRawAttributes((array) $entry, true);
}, $result));
【讨论】:
我不认为你可以默认。我扩展了 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);
}
}
【讨论】:
selectRaw('count(*) as count')或whereRaw('1=1')。
使用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")));
在Laravel website 上查看有关Raw-Expressions 的更多信息。
【讨论】:
Eloquent 上,您不能使用完整的原始查询,但您可以使用Query Builder 和Eloquent 的所有方法。
use DB; 如果没有找到数据库
select * from table?出于安全原因?
use Illuminate\Support\Facades\DB;