【问题标题】:Laravel Complex Relationships Through PolymorphismLaravel 通过多态的复杂关系
【发布时间】:2019-07-31 03:24:19
【问题描述】:

我有以下使用 Laravel 5.3 的模型:

提供者:

// Provider model

$primaryKey = 'id'

public function activities()
{
    return $this->hasMany(Activity::class);
}

活动:

// Activity model

$primaryKey = 'id'

public function provider()
{
    return $this-belongsTo(Provider::class);
}

public function semesters()
{
    return $this->hasMany(Semester::class);
}

public function semesterPurchases()
{
    return $this->hasManyThrough(Purchase::class, Semester::class, 'activity_id', 'purchasable_id')
        ->where('purchasable_type', Semester::class);
}

学期:

// Semester model

$primaryKey = 'id'

public function activity()
{
    return $this->belongsTo(\App\Models\Activity::class, 'activity_id', 'id');
}

购买:

// Purchase model

$primaryKey = 'id'

public function purchasable()
{
    return $this->morphTo();
}

在我的情况下,Semester::classpurchasable_type。有没有办法在Provider::classPurchase::class 之间建立关系?为了使这样的事情成为可能:

$providers = Provider::select('id', 'name', 'address')
  ->with('purchases')
  ->where('providers.id', 1)
  ->get();

我不想参加这样的活动:

$providers = Provider::select('id', 'name', 'address')
  ->with('activities.purchases')
  ->where('providers.id', 1)
  ->get();

我知道在Activity::class 上使用hasManyThrough 可以做到这一点

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    Laravel 不支持直接关系。

    我为这样的案例创建了一个包:https://github.com/staudenmeir/eloquent-has-many-deep

    class Provider extends Model
    {
        use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
    
        public function purchases()
        {
            return $this->hasManyDeep(
                Purchase::class,
                [Activity::class, Semester::class],
                [null, null, ['purchasable_type', 'purchasable_id']]
            );
        }
    }
    
    Provider::find($id)->purchases;
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 2019-04-04
      • 2022-01-06
      • 2017-09-03
      • 2023-03-19
      • 2018-05-20
      • 2019-04-17
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多