Laravel 关系 我应该使用 hasManyThrough 还是 belongsToMany?嵌套 3 个表
Laravel Relations Should I use hasManyThrough or belongsToMany? Nesting 3 Tables
我之前问过这个问题,但格式不同而且不正确。
交易是,我有 4 个表,我想嵌套其中。
我想要包含 measurement_data 的测量,其中包含 measurement_fields,其中包含 measurement_type(仅显示重要字段)。
到目前为止,除了 MeasurementData 中的 MeasurementFields 之外,我什么都有。
我的表:
measurements
- id
- client_id (not really important now)
measurement_data
- id
- measurement_id
- measurement_field_id
measurement_fields
- id
- type_id
measurement_types
- id
- name
我试过 hasManyThrough 和 belongsToMany 但我无法让它们中的任何一个工作。这就是我现在模型中的内容:
测量模型
protected $fillable = [
'client_id',
];
public $timestamps = false;
public function clients() {
return $this->belongsTo(Client::class, 'client_id');
}
public function measurement_datas() {
return $this->hasMany(MeasurementData::class);
}
public function measurement_fields() {
return $this->belongsToMany(MeasurementField::class, 'measurement_fields', 'measurement_id', 'measurement_field_id')
->withPivot([
'type_id',
'name',
'enabled',
]);
}
测量数据模型
protected $fillable = [
'measurement_id',
'measurement_field_id',
'data',
];
public function measurement() {
return $this->belongsTo(Measurements::class, 'measurement_id');
}
测量场模型
protected $table = 'measurement_fields';
protected $fillable = [
'type_id',
'name',
'enabled',
];
public $timestamps = false;
public function measurement_type() {
return $this->belongsTo(MeasurementType::class, 'type_id');
}
MeasurementType 模型
protected $table = 'measurement_types';
protected $fillable = [
'name',
];
public function measurement_field() {
return $this->hasMany(MeasurementField::class);
}
我的控制器 MeasurementController
public function index()
{
return JsonResource::collection(Measurement::with(['clients', 'measurement_datas', 'measurement_fields'])->get());
}
我将不胜感激任何帮助,因为我已经坚持了一段时间了。谢谢:)
好的,首先,你的 MeasurementData@measurement
方法使用了 Measurements
而它应该是 Measurement
(单数 - 以匹配 class 名称)。
其次,您在 belongsToMany
中引用的 table 应该是枢轴 table 而不是您想要的关系的 table 。 withPivot
不需要 work/be,因为这些字段不是枢轴 table 的一部分。此外,如果不遵循 Laravel 的 naming convention,您只需为关系定义列名称。这就是您的 measurement_fields
方法的样子:
public function measurement_fields()
{
return $this->belongsToMany(MeasurementField::class, 'measurement_data');
}
或者,您可以在 MeasurementData
和 MeasurementField
之间建立关系(如果您还没有这样做的话),然后使用 nested eager loading。将以下内容添加到您的 MeasurementData
模型中:
public function measurement_field()
{
return $this->belongsTo(MeasurementField::class);
}
然后您可以使用以下方式加载信息:
Measurement::with(['clients', 'measurement_datas.measurement_field.measurement_type', 'measurement_fields'])
我之前问过这个问题,但格式不同而且不正确。
交易是,我有 4 个表,我想嵌套其中。
我想要包含 measurement_data 的测量,其中包含 measurement_fields,其中包含 measurement_type(仅显示重要字段)。
到目前为止,除了 MeasurementData 中的 MeasurementFields 之外,我什么都有。
我的表:
measurements
- id
- client_id (not really important now)
measurement_data
- id
- measurement_id
- measurement_field_id
measurement_fields
- id
- type_id
measurement_types
- id
- name
我试过 hasManyThrough 和 belongsToMany 但我无法让它们中的任何一个工作。这就是我现在模型中的内容:
测量模型
protected $fillable = [
'client_id',
];
public $timestamps = false;
public function clients() {
return $this->belongsTo(Client::class, 'client_id');
}
public function measurement_datas() {
return $this->hasMany(MeasurementData::class);
}
public function measurement_fields() {
return $this->belongsToMany(MeasurementField::class, 'measurement_fields', 'measurement_id', 'measurement_field_id')
->withPivot([
'type_id',
'name',
'enabled',
]);
}
测量数据模型
protected $fillable = [
'measurement_id',
'measurement_field_id',
'data',
];
public function measurement() {
return $this->belongsTo(Measurements::class, 'measurement_id');
}
测量场模型
protected $table = 'measurement_fields';
protected $fillable = [
'type_id',
'name',
'enabled',
];
public $timestamps = false;
public function measurement_type() {
return $this->belongsTo(MeasurementType::class, 'type_id');
}
MeasurementType 模型
protected $table = 'measurement_types';
protected $fillable = [
'name',
];
public function measurement_field() {
return $this->hasMany(MeasurementField::class);
}
我的控制器 MeasurementController
public function index()
{
return JsonResource::collection(Measurement::with(['clients', 'measurement_datas', 'measurement_fields'])->get());
}
我将不胜感激任何帮助,因为我已经坚持了一段时间了。谢谢:)
好的,首先,你的 MeasurementData@measurement
方法使用了 Measurements
而它应该是 Measurement
(单数 - 以匹配 class 名称)。
其次,您在 belongsToMany
中引用的 table 应该是枢轴 table 而不是您想要的关系的 table 。 withPivot
不需要 work/be,因为这些字段不是枢轴 table 的一部分。此外,如果不遵循 Laravel 的 naming convention,您只需为关系定义列名称。这就是您的 measurement_fields
方法的样子:
public function measurement_fields()
{
return $this->belongsToMany(MeasurementField::class, 'measurement_data');
}
或者,您可以在 MeasurementData
和 MeasurementField
之间建立关系(如果您还没有这样做的话),然后使用 nested eager loading。将以下内容添加到您的 MeasurementData
模型中:
public function measurement_field()
{
return $this->belongsTo(MeasurementField::class);
}
然后您可以使用以下方式加载信息:
Measurement::with(['clients', 'measurement_datas.measurement_field.measurement_type', 'measurement_fields'])