【问题标题】:Laravel hasManyThrough giving error when nestingLaravel hasManyThrough 嵌套时出错
【发布时间】:2021-12-27 13:08:46
【问题描述】:

我基本上有 3 个要嵌套的表,其中 2 个已经工作,但我无法让 hasManyThough 工作。 我的桌子:

tablename : measurements            
id  
client_id   (not important for now.)
            
tablename : measurement_data            
id  
measurement_id  
measurement_field_id    
data        
    
tablename : measurement_fields          
id         
type_id    (not important for now)
name       
enabled   
                    

这是我的控制器功能:

    public function index()
    {
        return JsonResource::collection(Measurement::with(['clients', 'measurement_data', 'measurement_fields'])->get());
    }

我的模型测量功能:

    public function clients() {
        return $this->belongsTo(Client::class, 'client_id');
    }

    public function measurement_field() {
        return $this->hasMany(MeasurementData::class);
    }

    public function measurement_data() {
        return $this->hasManyThrough(MeasurementField::class, MeasurementField::class, 'measurement_field_id', 'measurement_id');
    }

我的模型MeasurementData函数:

    public function measurements() {
        return $this->belongsTo(Measurements::class, 'measurement_id'); 
    }

    public function measurement_fields() {
        return $this->hasOne(MeasurementType::class, 'type_id');
    }

我的模型MeasurementField函数:

    public function measurements() {
        return $this->belongsTo(MeasurementsData::class, 'measurement_field_id'); 
    }

每当我获取它时,我都会在控制台中得到它:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'measurement_fields.measurement_field_id' in 'field list' (SQL: select `measurement_data`.*, `measurement_fields`.`measurement_field_id` as `laravel_through_key` from `measurement_data` inner join `measurement_fields` on `measurement_fields`.`id` = `measurement_data`.`measurement_id` where `measurement_fields`.`measurement_field_id` in (1, 2, 3))"

【问题讨论】:

    标签: sql laravel vue.js eloquent


    【解决方案1】:

    在您的测量模型更改中

    public function measurement_data() {
        return $this->hasManyThrough(MeasurementField::class, MeasurementField::class, 'measurement_field_id', 'measurement_id');
    }
    

    public function measurement_data() {
            return $this->hasManyThrough(MeasurementField::class, MeasurementData::class, 'measurement_id', 'measurement_field_id');
        }
    

    参考This

    【讨论】:

    • ``` SQLSTATE[42S22]:未找到列:1054 'on 子句'中的未知列'measurement_fields.measurement_field_id'(SQL:选择measurement_fields.*,measurement_data.measurement_id作为laravel_through_key 来自measurement_fields 内部连接measurement_datameasurement_data.id = measurement_fields.measurement_field_id 其中measurement_data.measurement_id in (1, 2, 3)) ``` 是这次我得到了什么:/
    【解决方案2】:

    你对关系有一些错误:) 在您的测量模型函数中,您更改了测量字段和测量数据。 试试这个:

    public function measurement_datas() {
        return $this->hasMany(MeasurementData::class);
    }
    
    
    public function measurement_fields() {
        return $this->hasManyThrough(MeasurementField::class, MeasurementField::class, 'measurement_field_id', 'measurement_id');
    }
    

    在您的 MeasurementField 模型函数中:

    public function measurement_data() {
        return $this->belongsTo(MeasurementsData::class, 'measurement_field_id'); 
    }
    

    在您的 MeasurementData 模型函数中:

     public function measurement() {
        return $this->belongsTo(Measurements::class, 'measurement_id'); 
    }
    
    public function measurement_field() {
        return $this->hasOne(MeasurementType::class, 'type_id');
    }
    

    使用命名约定很重要。如果是一对多关系,在“多”一侧使用复数,在“一”一侧使用单数。此外,relationship 的名称应表明已建立关系的类的名称,以免产生误解。还要尝试给出数据库中显示的正确键名。

    有关更多信息,您可以找到关于此主题的非常清晰和良好的文档: https://laravel.com/docs/8.x/eloquent-relationships

    【讨论】:

    • 我不知道为什么会切换功能,但我已经修复了这个问题,但仍然出现错误。现在,在应用您的修复后,我很遗憾仍然得到一个错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'measurement_fields.measurement_field_id' in 'on Clause' (SQL: select measurement_fields.*, measurement_data.@987654327 @ as laravel_through_key from measurement_fields inner join measurement_data on measurement_data.id = measurement_fields.measurement_field_id where measurement_data.measurement_id in (1, 2, 3))
    • 你也有测量类型表吗,如果有,你能把那个的键发给我吗,如果没有,你应该改变以前实体中的键
    • 是的,先生,它只有:id name
    • 尝试通过文档检查每一个关系,并重写它们,检查你是否真的有那个地方需要的关系
    【解决方案3】:

    我在我的测量中修复了它:

        public function measurement_data() {
            return $this->hasManyThrough(MeasurementField::class, MeasurementField::class, 'measurement_field_id', 'measurement_id');
        }
    

    但是,这解决了我的问题:

        public function measurement_fields() {
            return $this->hasManyThrough(MeasurementField::class, MeasurementData::class, 'measurement_id', 'id');
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2016-02-11
      • 2014-09-19
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多