如何通过Eloquent查询raw?

时间:2014-04-08 00:25:45

标签: php laravel laravel-4 eloquent

我正在尝试在我的Laravel应用程序中进行查询,并且我想为查询使用常规结构。这个类要么使用Eloquent所以我需要找到一些完全原始的查询。

可能类似于Model::query($query);。只有这不起作用。

9 个答案:

答案 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();