【问题标题】:Laravel Pivot Table With Result From Other TableLaravel 数据透视表与其他表的结果
【发布时间】:2021-08-06 08:14:16
【问题描述】:

我对关系数据透视表和结果感到困惑。 例如 : 我有 3 个表 + 1 个用于插入数据的表

structurals
    id
    name

indicators
    id
    name

structural_indicator (Pivot Table)
    id
    structural_id
    indicator_id

quality_indicators (Insert Table)
    id
    structural_indicator_id
    numerator_score
    denominator_score
    date_at

这是我的关系:

    //Indicator Model
    public function structurals() {
        return $this->belongsToMany(Structural::class, 'structural_indicator');
    }

    //Structural Model
    public function Indicators() {
        return $this->belongsToMany(Indicator::class, 'structural_indicator')
                ->withPivot(['id']);
    }

对于与数据透视表的关系,没问题。

但我想要一个带有插入表 (quality_indicators) 的关系数据透视表,按 structural_iddate_at 搜索,并显示带有 quality_indicators 的结果数据透视表。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    你需要创建StructuralIndicatorPivotModel如下

    <?php
    
    namespace yournamespace;
    
    use Illuminate\Database\Eloquent\Model;
    
    class StructuralIndicatorPivotModel extends Model
    {
        /**
         *
         */
        protected $table = 'structural_indicator';
    
        /**
         *
         */
        protected $with = ['qualityIndicator'];
    
        /**
         *
         */
        public function qualityIndicator()
        {
            return $this->hasOne(QualityIndicator::class, 'structural_indicator_id', 'id');
        }
    }
    

    然后您需要在IndicatorStructural 模型中添加与数据透视表的关系 指标模型

    <?php
    
    namespace yournamespace;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Indicator extends Model
    {
        /**
         *
         */
        public function structurals() {
            return $this->belongsToMany(Structural::class, 'structural_indicator');
        }
    
        /**
         *
         */
        public function structuralIndicatorPivot() {
            return $this->hasMany(StructuralIndicatorPivotModel::class, 'indicator_id');
        }
    }
    

    结构模型

    <?php
    
    namespace yournamespace;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Structural extends Model
    {
        /**
         *
         */
       public function indicators() {
        return $this->belongsToMany(Indicator::class, 'structural_indicator');
    }
    
        /**
         *
         */
        public function structuralIndicatorPivot() {
            return $this->hasMany(StructuralIndicatorPivotModel::class, 'structural_id');
        }
    }
    

    所以现在您可以将查询编写为Structural::where('id', 'someId')-&gt;with('structuralIndicatorPivot')-&gt;get()Indicator::where('id', 'someId')-&gt;with('structuralIndicatorPivot')-&gt;get()quality_indicators 数据将自动加载,因为它与$withStructuralIndicatorPivotModel 相关联。

    【讨论】:

    • 如果我使用 StructuralIndicatorPivotModel::find($id); 就可以了。但我想使用 Structural::find($id) ?我使用了 Structural::find($id)->indicator,我成功地显示了数据透视表中的数据,但我希望每个指标都有 qualityIndi​​cator 结果。
    • 以上机型是不要调用find()就可以了。但是要使用$with,它将用于在每次调用枢轴时自动加载qualityIndicator
    • 谢谢先生,这真的很了不起。但是我有一个问题,当我从 quality_indicators 表中获得 date_at 条件时。 -&gt;whereHas('structuralIndicatorPivot.qualityIndicator', function($query) { $query-&gt;where('date_at', '2021-05-19'); })。如果与日期不同,则结果为空。我希望结果始终显示并且结构指标Pivot.qualityIndi​​cator 结果为空
    • 先生,感谢您的所有回答。问题已关闭。这是我的语法$structural = Structural::where('id', $id) -&gt;with(['indicators', 'structuralIndicatorPivot' =&gt; function($query) { $query-&gt;with('qualityIndicator', function($q){ $q-&gt;where('date_at', '2021-05-19'); }); }]) -&gt;first();
    【解决方案2】:

    我正在尝试使用此依赖项 https://github.com/staudenmeir/eloquent-has-many-deep

    但错误:

    调用模型 [App\Models\Indicator] 上的未定义关系 [pivot]。

    这是我的模型和支点

    class Structural extends Model
    {
    
        public function indicators()
        {
            return $this->belongsToMany(Indicator::class, 'structural_indicator')
                        ->withPivot(['id'])
                        ->using(StructuralIndicator::class);
        }
    
        public function qualityIndicator(){
            return $this->hasManyDeep(Indicator::class,
                [StructuralIndicator::class, QualityIndicator::class],
                ['structural_id', 'structural_indicator_id'],
                ['id', 'id']
            );
        }
    }
    
    class Indicator extends Model
    {
        public function structurals()
        {
            return $this->belongsToMany(Structural::class, 'structural_indicator')->using(StructuralIndicator::class);
        }
    }
    
    class StructuralIndicator extends Pivot
    {
        public function structural(){
            return $this->belongsTo(Structural::class);
        }
        
        public function indicator(){
            return $this->belongsTo(Indicator::class);
        }
    
        public function qualityIndicator()
        {
            return $this->hasMany(QualityIndicator::class, 'structural_indicator_id');
        }
    }
    
    class QualityIndicator extends Model
    {
        public function structuralIndicator()
        {
            return $this->belongsToMany(StructuralIndicator::class, 'structural_indicator_id');
        }
    }
    

    这是我在控制器中的代码:

    $structural = Structural::with('indicators')->with('indicators.pivot.qualityIndicator')->where('id', 6)->first();
    

    【讨论】:

    • 我已经更新了答案。它现在工作得很好。试试看吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多