将sql select转换为Laravel查询构建器

时间:2017-01-13 04:18:54

标签: sql laravel

来自$stemp [hasil] => 20,8,24

的数组

我的SQL查询SELECT * FROM 'objek' WHERE objek.id IN ('20','8','24')

我正在尝试DB::select("SELECT * FROM 'objek' WHERE objek.id IN ('$stemp')");

它不起作用,并获得错误数组到字符串转换。

4 个答案:

答案 0 :(得分:1)

清洁解决方案

使用Laravel Query Builder方法进行查询:

DB::table('objek')->select('*')->whereIn('id', [20, 8, 4])->get()

请注意,由于查询构建器默认选择->select('*'),因此不需要*。所以你可以删除它:

DB::table('objek')->whereIn('id', [20, 8, 4])->get()

糟糕(但有效)的解决方案

由于$stemp是一个数组,因此需要在将其连接到查询之前将其转换为字符串:

$stemp = [20, 8, 24];

// Put your ID's between Quotes (not necessary actually, but 
// I'm just trying to replicate the desired query)
$stemp = array_map(function($id) { return "'{$id}'"; }, $stemp); // ['20','8','24']

// Glue the pieces using a comma
$stemp = implode(',', $stemp); // string(13) "'20','8','24'"

// Now you can concatenate it to your query
// Note that you shouldn't use the single quotes between $stemp
// since your quotes are already on each number.
DB::select("SELECT * FROM 'objek' WHERE objek.id IN ($stemp)");

为什么这是一个糟糕的解决方案?

通过这种方式执行查询可以打开SQL Injection vulnerability,因此您必须执行以下任一操作:

  • 信任您的数据源,例如:您的$stemp来自您信任该内容的其他查询
  • 清理数据以删除恶意代码

为什么第一种解决方案更好?

  • 您的代码变得更具人性化
  • Laravel Query Builder自动清理您的输入

答案 1 :(得分:1)

你应该这样做。

DB::table('objek')
    ->select('*')
    ->whereIn('id', $stemp)
    ->get();

您可以在laravel.com/docs/5.3/queries#where-clauses

中找到有关Laravel Where的更多信息

但我更喜欢使用Eloquent而不是DB::table()

您可以创建类似Objek的模型,并使用Illuminate\Database\Eloquent\Model

进行扩展
use Illuminate\Database\Eloquent\Model;

class Objek extends Model
{
    protected $table = 'Objek';

}

然后就可以了,

Objek::select('*')
    ->whereIn('id', $stemp)
    ->get();

答案 2 :(得分:0)

取决于您想要的方式

如果存在模型

Model::whereIn('columnName', $array)->get()

查询表

DB::table('users')->whereIn('columnName', $array)->get();

如果您想了解更多,请查看https://laravel.com/docs/5.3/queries#raw-expressions

希望这有帮助。

答案 3 :(得分:0)

我想你应该试试这个:

{{1}}

希望这对你有用!