【问题标题】:Eloquent in Laravel-Datatables, select in select?在 Laravel-Datatables 中雄辩,在选择中选择?
【发布时间】:2017-10-20 15:26:55
【问题描述】:

我有 3 张桌子,第 1 个有第 2 个的 FK,第 2 个有第 3 个的 FK:

Table 1: [admin_demandas]
-------------------------
id_demanda|   projec_id
-------------------------

Table 2: [admin_projec]
-------------------------
id_projec |   sub_id
-------------------------

Table 3: [admin_sub]
-------------------------
id_sub    |   name
-------------------------

我需要的是从表 3 中获取“名称”,但从表 1 的模型开始。

我正在尝试这样的事情:

$data = AdminDemanda::select([
    'id_demanda',
    'admin_projec.sub_id AS sub_id',
    'admin_sub.name AS name',])
    ->join('admin_projec', 'admin_demandas.projec_id', '=', 'admin_projec.id_projec')
    ->join('admin_sub', 'admin_projec.sub_id', '=', 'admin_sub.id_sub')
    ->get();

return Datatables::of($data)->make(true);

我只使用 1 个 JOIN(2 个表)完成了我的数据表,但不确定如何执行这 2 个 JOIN(3 个表)。我收到了这个错误:

[Err] 1054 - Unknown column 'admin_projec.sub_id' in 'on clause'

我应该在我的查询中修改什么? 我是否需要使用带有 DB::raw() 查询的查询构建器而不是 Eloquent?

【问题讨论】:

    标签: laravel eloquent yajra-datatable


    【解决方案1】:

    解决了这个问题:

    Inner join between three tables in mysql

    这很简单...如果有人需要,我的 Datatable 查询是:

    $datos = AdminDemanda::select([
        'id_demanda',
        'admin_dis.nombre AS nombre_dist',
        'admin_sub.nombre AS nombre_subes',
        'mes AS mes_demanda',
        'admin_sistemas.nombre AS nombre_sistema',
        'admin_demandas.demanda_mwh AS mwh'])
        ->join('admin_projec', 'admin_demandas.proyeccion_demanda_id', '=', 'admin_projec.id_proyeccion_demanda')
        ->join('admin_sub', 'admin_projec.subestacion_id', '=', 'admin_sub.id_subestacion')
        ->join('admin_dis', 'admin_projec.dist_id', '=', 'admin_dis.id_dist')
        ->join('admin_sistemas', 'admin_projec.sistema_id', '=', 'admin_sistemas.id_sistema')
        ->get();
    

    【讨论】:

    • 很高兴你想通了。为了获得最佳实践,请尝试稍后使用 Eloquent 及时解决此问题。它比使用@Raccoon 建议的大量连接要好得多。它最终将使表之间的所有这些关系更容易理解。
    • 谢谢,我尝试了很多,但我无法得到它。但我知道,我必须利用 Laravel 提供的优势
    【解决方案2】:

    你应该编辑你的模型

    以AdminSub模型为例

    public function projec(){
        return $this->hasMany(AdminProjec::class , 'sub_id');
    }
    

    你应该可以的

    \AdminSub::first()->projec();
    

    然后继续编辑具有相同关系的 AdminProjec 模型

    public function demandas(){
        return $this->hasMany(AdminDemandas::class , 'projec_id');
    }
    

    现在你可以试试

    //I do not remember which one will works
    \AdminSub::first()->projec()->first()->demandas()->name
    //or 
    \AdminSub::first()->projec()->first()->demandas()->get()->name 
    

    【讨论】:

    • 我放的代码是一个例子,第二个表有 4 个 FK 指向另一个表,是否有另一种方法来进行查询而不是编辑模型?无论如何,这个模型的东西会起作用吗?谢谢,我稍后试试。
    • 我认为使用模型是处理数据库关系的最佳方式。因为您只设置了一次,一切都将在任何时候工作。如果您更改字段名称的表名称,您只需编辑一些内容即可使其运行。如果您将完整查询与连接一起使用,则必须编辑使用此表/字段的每个页面,一旦您的应用程序变得更大,这可能是一场真正的噩梦
    猜你喜欢
    • 2018-06-27
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多