从Laravel中的一行中选择单列?

时间:2014-05-10 21:22:23

标签: laravel laravel-4

如何从Laravel 4中的单行中获取单个列?

以下是我正在尝试的内容:

return DB::selectOne("
    SELECT EXISTS(
        SELECT *
        FROM permissions p
            JOIN role_permissions rp ON rp.permission_id=p.id
            JOIN user_roles ur ON ur.role_id=rp.role_id
        WHERE ur.user_id=? AND p.code=?
    )
    ",[Auth::user()->id,$perm_code]);

selectOne会返回这个丑陋的对象:

object(stdClass)#297 (1) {
  ["EXISTS(
                SELECT *
                FROM permissions p
                    JOIN role_permissions rp ON rp.permission_id=p.id
                    JOIN user_roles ur ON ur.role_id=rp.role_id
                WHERE ur.user_id=? AND p.code=?
      "]=>
  string(1) "0"
}

还有更好的东西吗?


使用PDO也很难看:

$stmt = DB::getPdo()->prepare("
    SELECT EXISTS(
        SELECT *
        FROM permissions p
            JOIN role_permissions rp ON rp.permission_id=p.id
            JOIN user_roles ur ON ur.role_id=rp.role_id
        WHERE ur.user_id=? AND p.code=?
    )
    ");
$stmt->execute([Auth::user()->id,$perm_code]);
return (bool)$stmt->fetchColumn();

3 个答案:

答案 0 :(得分:21)

使用此:

DB::table('users')->pluck('columname');

来自内联文档:

/**
 * Pluck a single column's value from the first result of a query.
 *
 * @param  string  $column
 * @return mixed
 */

答案 1 :(得分:3)

这是你在找什么?

DB::table('users')->select('columnName')->join('whatever',...,...,...)->take(1)->get();

另一个例子

DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('columnName')
            ->take(1)
            ->get();

Raw不适合你?:

return DB::select(DB::raw("
    SELECT EXISTS(
        SELECT *
        FROM permissions p
            JOIN role_permissions rp ON rp.permission_id=p.id
            JOIN user_roles ur ON ur.role_id=rp.role_id
        WHERE ur.user_id=? AND p.code=?
    ))
    ",[Auth::user()->id,$perm_code]);

您可以处理该对象以获得您想要的内容:

$result = DB::select(DB::raw("
    SELECT EXISTS(
        SELECT *
        FROM permissions p
            JOIN role_permissions rp ON rp.permission_id=p.id
            JOIN user_roles ur ON ur.role_id=rp.role_id
        WHERE ur.user_id=? AND p.code=?
    ) as exists)
    ",[Auth::user()->id,$perm_code]);

$result[0]->exists ? '1' : '0'

这是我刚刚在这里做的一个测试:

Route::any('test', ['as' => 'test', function()
{

    $result = DB::select(DB::raw('select exists(select * from users) as  exists;'));

    dd($result[0]->exists ? '1' : '0');

}]);

像魅力一样工作。

答案 2 :(得分:0)

要从第一个结果中获取单个值,可以使用\Illuminate\Database\Query\Builder::value。例如

$lastInvoice = DB::table('booking_groups')
    ->where('company_id','=',$booking->company_id)
    ->orderBy('invoice_number','desc')
    ->value('invoice_number');