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');
}

或者,您可以在 MeasurementDataMeasurementField 之间建立关系(如果您还没有这样做的话),然后使用 nested eager loading。将以下内容添加到您的 MeasurementData 模型中:

public function measurement_field()
{
    return $this->belongsTo(MeasurementField::class);
}

然后您可以使用以下方式加载信息:

Measurement::with(['clients', 'measurement_datas.measurement_field.measurement_type', 'measurement_fields'])