使用queryBuidler运行get()时,类stdClass的对象无法转换为字符串

时间:2019-03-08 18:13:45

标签: php laravel query-builder

我正在尝试运行此SQL查询:

SELECT head_account_id, account_id, created_on, result, COUNT(*) AS counter FROM notes
WHERE result = 'not_processed' AND created_on >= (now() - INTERVAL 3 DAY) AND created_on <= (now() - INTERVAL 8 HOUR)
AND account_id IN (SELECT id FROM accounts WHERE account_status = 'approved' AND demo = 0)
GROUP BY account_id
ORDER BY head_account_id, account_id, created_on DESC;

使用Laravel querybuilder:

$appointments = DB::table('confirmed_appointments')
            ->select('head_account_id','account_id','created_on','result', DB::raw('count(*) as counter'))
            ->where('result', 'not_processed')
            ->where('created_on', '>=', DB::raw('now() - interval 3 day'))
            ->where('created_on', '<=', DB::raw('now() - interval 8 hour'))
            ->whereIn('account_id', $id)
            ->groupBy('account_id')
            ->orderBy('head_account_id')
            ->orderBy('account_id')
            ->orderBy('created_on', 'desc')
            ->get();

其中$ id是:

$id   = DB::table('accounts')
            ->select('id')
            ->where('account_status','Approved')
            ->where('demo','0')
            ->get();

上面的查询正常工作-我已经使用dd()进行了检查。

我在$ appointments = .....-> get()时遇到错误

  

“类stdClass的对象无法转换为字符串”

我知道get()通常会返回一个stdClass对象,但是我不明白为什么我根本不能使用get()。许多其他解决方案说使用get()-> toArray();但是,我什至无法使get()正常运行。.如果不对结果运行get()并运行dd(),则会得到有关查询的信息数组,而不是结果本身。

我是Laravel / PHP的新手,所以我可能缺乏知识,但我希望有人能帮助我。

感谢您的光临!

3 个答案:

答案 0 :(得分:1)

您可以尝试使用pluck()检索ID值数组,即:

$id = DB::table('accounts')
        ->select('id')
        ->where('account_status','Approved')
        ->where('demo','0')
        ->pluck('id');

使用get(),您将在$ id var中检索标准对象的集合。

答案 1 :(得分:0)

与遇到该错误的get方法无关。这是关于您试图对该查询的结果进行处理。如果您试图回显集合类的结果,则会抛出该错误。您无法回显对象吗?

根据文档:

get()返回一个集合对象。这意味着它具有结果数组。在您的情况下,它返回的集合对象包含对查询进行数学计算的任何记录ID

first()仅返回一个包含一个记录的结果

如果只希望返回一个id并可以将其视为string,以便可以在视图中回显它,则必须使用first()方法。

合并:

如果需要,id可以使用get(),并且必须对每个结果都进行循环。 如果您只想使用一个id,请使用first();

但是请注意,即使您首先使用它也会返回std类,因此在这种情况下,如果您要访问id。您必须写$result->id并将其回显。

答案 2 :(得分:0)

在您的情况下,$id是匹配数据的整行,并且只需要id列,因此您需要这样做

$id   = DB::table('accounts')
            ->select('id')
            ->where('account_status','Approved')
            ->where('demo','0')
            ->get();
//The ID column
$id = $id->id;