DB::select 的输出与 phpMyAdmin 中的原始查询不同

Posted

技术标签:

【中文标题】DB::select 的输出与 phpMyAdmin 中的原始查询不同【英文标题】:Output of DB::select is different from raw query in phpMyAdmin 【发布时间】:2020-12-06 12:32:29 【问题描述】:

我在我的 Laravel 应用程序中使用了一个 MariaDB 查询,我希望它返回 7 列。当我用 php 转储结果数组时,它似乎只返回 4。但是,当我采用相同的查询并在 PhpMyAdmin SQL 编辑器中运行它时,它完全按照我的预期返回所有 7。

只是想知道是什么导致 Laravel 将结果过滤到只有四列:状态、姓名、电话号码和描述?

谢谢!

Laravel 查询:

    $entries = DB::select('SELECT status, contacts.name, contacts.telephone_number, companies.name, roles.name, stages.description, actions.description FROM entries JOIN contacts ON entries.contact_id = contacts.id JOIN companies ON contacts.id = companies.contact_id JOIN roles ON companies.id = roles.company_id JOIN stages ON roles.id = stages.role_id JOIN actions ON stages.id = actions.stage_id');

查询 PHPMyAdmin SQL 编辑器:

    SELECT status, contacts.name, contacts.telephone_number, companies.name, roles.name, stages.description, actions.description FROM entries JOIN contacts ON entries.contact_id = contacts.id JOIN companies ON contacts.id = companies.contact_id JOIN roles ON companies.id = roles.company_id JOIN stages ON roles.id = stages.role_id JOIN actions ON stages.id = actions.stage_id

【问题讨论】:

这不是你使用 laravel 查询的方式。 【参考方案1】:

这两种情况的结果相同。他们只是使用相同的属性,因此雄辩的结果会相互覆盖。使用别名来解决问题

SELECT status, contacts.name as contact_name, contacts.telephone_number, companies.name as company_name, roles.name as role_name , stages.description, actions.description FROM entries JOIN contacts ON entries.contact_id = contacts.id JOIN companies ON contacts.id = companies.contact_id JOIN roles ON companies.id = roles.company_id JOIN stages ON roles.id = stages.role_id JOIN actions ON stages.id = actions.stage_id

【讨论】:

好声音。干杯。 @RobertYoung 就像 vidal 说的那样,这不是你使用 eloquent 的方式。您应该声明关系并将它们用于这种结果。【参考方案2】:

正如@N69S 回答的那样,您应该设置别名以避免覆盖。另一件事,如果你使用 Laravel,雄辩是你的朋友:

$entries = DB::table('entries')
    ->join('contacts', 'entries.contact_id', '=', 'contacts.id')
    ->join('companies', 'contacts.id', '=', 'companies.contact_id')
    ->join('roles', 'companies.id', '=', 'roles.company_id')
    ->join('stages', 'roles.id', '=', 'stages.role_id')
    ->join('actions', 'stages.id', '=', 'actions.stage_id')
    ->select('status', 'contacts.name AS contact_name', 'contacts.telephone_number', 'companies.name AS company_name', 'roles.name AS role_name', 'stages.description AS stage_description', 'actions.description AS action_description')
    ->get();

更好的方法是使用模型和集合关系。

【讨论】:

以上是关于DB::select 的输出与 phpMyAdmin 中的原始查询不同的主要内容,如果未能解决你的问题,请参考以下文章

DB2 SELECT MOST 中频繁出现并与其他表链接

Mysql DB select from table where field语句java

DB::Table 和 DB::Select 之间的区别

db2 select问题

Laravel DB::select() 不返回“正确”数据

如何在 DB::select(query) 上使用分页 - Laravel