如何使用查询生成器在数组中建立关系?拉拉维尔

Posted

技术标签:

【中文标题】如何使用查询生成器在数组中建立关系?拉拉维尔【英文标题】:How to use Query Builder to make a relation in an array? Laravel 【发布时间】:2020-06-24 14:02:15 【问题描述】:

我想与查询生成器建立关系...我有三个表,我想加入这些表以使用该函数。我在模型中工作..而不是在控制器中

这是我的功能

public function map($contactabilidad): array

    $relation = DB::table('tbl_lista_contactabilidad')
        ->join('tbl_equipo_postventaatcs', 'tbl_equipo_postventaatcs.id', '=', 'tbl_lista_contactabilidad.postventaatc_id')
        ->join('users', 'users.id', '=', 'tbl_equipo_postventaatcs.asesor_id')
        ->get();

    return [
        $contactabilidad->$relation->name,
        $contactabilidad->postventaatc_id,
        $contactabilidad->rif,
        $contactabilidad->razon_social,
        $contactabilidad->fecha_contacto,
        $contactabilidad->persona_contacto,
        $contactabilidad->correo_contacto,
        $contactabilidad->numero_contacto,
        $contactabilidad->celular_contacto,
        $contactabilidad->comentarios,
        $contactabilidad->contactado,
        $contactabilidad->respuesta->respuesta
    ];

【问题讨论】:

【参考方案1】:

Query\Builder 最好被认为是 Eloquent 使用的主要工具,但它是一个完全不同的包。 Query\Builder 的目的是将 SQL 语法与输入它的逻辑分离,而 Eloquent 的目的是将逻辑与表结构和关系分离。所以只有 Eloquent 支持 Model 和 Relation 类,Query\Builder 不支持。而且您所要求的与关系有关,所以简而言之,您有点找错了树。

顺便说一句,我在这里区分“Query\Builder”,因为 Eloquent 也有自己的包装器,称为 Eloquent\Builder,它共享大部分相同的语法。无论好坏,Eloquent 都试图让开发人员以熟悉的方式与之交互。即使您已经通过神奇的__call 方法无缝地退出 Eloquent 并进入 Query\Builder 对象,也不必跟踪一组新的方法名称。它在 Eloquent\Collections 与 Support\Collections 方面也做了类似的事情。但这一开始会让事情变得非常混乱,因为你只需要知道你在说什么包。

所以,回答你的问题...

为三个表中的每一个构建一个模型类 将relationship methods 应用于每个模型,以预先配置模型并了解您的外键 使用lazy or eager-loading 联系他们

另外需要注意的是with() 确实要求 Eloquent 执行 JOIN。它所做的只是运行父查询,从结果中提取键值,在IN() 语句中使用它们运行子查询,然后将结果结合在一起。这就是嵌套结果的结果。从经验来看,从模型关系中生成真正的 JOIN 语句并保持表别名唯一是一种混乱,所以这个包只是跳过尝试这样做是有道理的(除了多对多关系上的数据透视表)。不过,这也有额外的好处,即您的相关表不需要存在于同一个数据库中。另一方面,Query\Builder join() 就像您在那里一样,将在顶层显示所有表的所有字段。

【讨论】:

以上是关于如何使用查询生成器在数组中建立关系?拉拉维尔的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)

如何签入 ::whereHas 查询某个列值?拉拉维尔

拉拉维尔。在具有关系的模型中使用 scope()

更新或创建行数据库。拉拉维尔

如何限制数据透视表的访问?拉拉维尔

如何在 json 响应中发送多个参数? (拉拉维尔)