我有3张如下表。
表A
id | val_a
1 | a1
2 | a2
3 | a3
表B
id | id_a| val_b | id_c
1 | 2 | b1 | 1
2 | 2 | b2 | 3
3 | 3 | b3 | 4
表C
id | val_c
1 | c1
2 | c2
3 | c3
4 | c4
获取如下数据的最佳方法是什么:
[
[0] => stdClass Object
(
[id_a] => 1
[val_a] => 'a1'
)
[1] => stdClass Object
(
[id_a] => 2
[val_a] => 'a2'
[table_b_c] => Array
(
[0] => stdClass Object
(
[id_b] => 1
[val_b] => 'b1'
[id_c] => 1
[val_c] => 'c1'
)
[1] => stdClass Object
(
[id_b] => 2
[val_b] => 'b2'
[id_c] => 3
[val_c] => 'c3'
)
)
)
[2] => stdClass Object
(
[id_a] => 3
[val_a] => 'a3'
[table_b] => Array
(
[0] => stdClass Object
(
[id_b] => 3
[val_b] => 'b3'
[id_c] => 4
[val_c] => 'c4'
)
)
)
]
TableA的模型
class TableA extends Model {
public function getTableA($id_a) {
return $this->where('id', $id_a)->with('TableB', 'TableC')->get()->toArray();
}
}
TableB的模型
class TableB extends Model {
public function tableA(){
$this->belongsTo('App\tableA');
}
public function tableC(){
$this->belongsTo('App\tableC');
}
}
TableC模型
class TableC extends Model {
}
我已尝试过上述关系,但它对我不起作用。
我正在使用Laravel 5.2
。并通过foreach循环实现这一点。但我不知道什么是最好的方法。我可以通过laravel或Mysql来做到这一点吗?谢谢你。
答案 0 :(得分:0)
我在我的身边设置了一些数据并使用this documentation来返回一个嵌套对象。
您的模型函数名称必须正确标记,然后才能生效:
$data = TableA::with(['recordsB.recordC'])->get();
dd($data->toArray());
这意味着将获取所有TableA记录,然后添加与每个A记录相关的表B中的所有记录。只要模型中的函数名称是recordsB。然后,dot
语法再次从表C(对于每个B记录)添加嵌套和相关记录,给出正确的函数名称。请参阅文档中的“嵌套预先加载”。
您描绘的数据似乎不适用于特定的A记录。因此,最好在控制器中进行急切加载。出于这个原因,我从getTableA
函数中删除了id参数。
在模型中 - 模型TableA:
class TableA extends Model {
public function getTableA() {
$data = TableA::with(['recordsB.recordC'])->get();
return $data;
}
public function recordsB(){
$this->hasMany('App\TableB');
}
}
模型表B:
class TableB extends Model {
public function recordA(){
$this->belongsTo('App\TableA');
}
public function recordC(){
$this->belongsTo('App\TableC');
}
}
Model TableC:
class TableC extends Model {
public function recordsB(){
$this->hasMany('App\TableB');
}
}