2017-10-20 115 views
0

我有3个表,第一次从第二有FK,第二个有一个FK从3:Laravel-Datatables中的雄辩,select in select?

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' 

我应该在我的查询中修改什么? 我是否需要使用查询生成器来代替Eloquent,并使用DB :: raw()查询?

回答

0

你应该修改你的模型

通过为例在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 
+0

我放的代码是一个例子,第二个表有4个FK指向另一个表,有没有另一种方式来查询tead编辑模型?反正这个模型的东西会起作用吗?谢谢,我会在稍后尝试。 – pmirnd

+0

我认为,使用模型是处理数据库关系的最佳方式。因为你只设置了一次,一切都可以随时使用。如果您更改字段名称的表名称,则只需编辑一些内容即可使其运行。如果您使用加入完整查询,则必须编辑使用此表/字段的每个页面,一旦您的应用程序变得更大,它可能会成为真正的噩梦。 – Raccoon

0

解决这个:

Inner join between three tables in mysql

很简单......现在的情况下,任何人都需要它,我的数据表的查询是:

$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(); 
+1

很高兴您明白了。要获得最佳实践,请尝试使用Eloquent稍后解决此问题。它会比使用@Raccoon建议的大量连接好得多。它最终将使表之间的所有这些关系更容易理解。 –

+0

谢谢,我尝试了很多,但我无法得到它。但我知道,我必须利用Laravel提供的优势 – pmirnd