如何在使用接口时定义关系

时间:2016-01-06 21:59:26

标签: php laravel inheritance laravel-5

Post-User - Image示例很好地涵盖了Laravel中多态关系的正常使用。

我正试图找到一种干净的方式来实现关系,让我们说一个Article / ContentA / ContentB关系。

articles
  id

content_1
  id

content_2
  id

user_defined_content_n
  id

contentables
  article_id
  contentable_id
  contentable_type // content_2, user_defined_content_n

本文不一定知道内容类,因此定义具有许多MorphedByMany关系的文章模型并不是我想要这样做的。

也许我正在很好地构建我的课程。我可以创建一个ContentEntity类,它可以转换为单个Content类,但如果可能的话我想避免这种情况。

也许这可以更好地解释我的问题。

class Article extends Model {
    public function contentEntities() {
        return $this->hasMany(ContentEntity::class);
    }
}

class ContentEntity extends Model {
    public function contentable() {
        return $this->morphTo();
    }
}

class Content extends Model {
    public function contentEntity() {
        return $this->morphOne(ContentEntity::class, 'contentable');
    }
}

class Video extends Model {
    public function contentEntity() {
        $this->morphOne(ContentEntity::class, 'contentable');
    }
}

这有效,但对我来说似乎非常不洁净。我认为它必须增​​加太多的开发人员开销才能管理ContentEntity父级。

修改 除非有人提供更好的解决方案,否则我使用ContentEntity s。

使用了EAV风格的解决方案

1 个答案:

答案 0 :(得分:1)

您可以随时将关系提取到特征,以便将来更容易维护和扩展:

<强>性状

trait Contentable
{
    public function contentEntity() {
        if(property_exists($this, 'contentable') && $contentable == 'many') {
            return $this->hasMany(ContentEntity::class);
        } else {
            return $this->morphOne(ContentEntity::class, 'contentable');
        }
    }

    // Future implementations
}

然后您需要做的就是在各种实体中使用特征:

<强>模型

class Content extends Model {
    use Contentable;
}

class Video extends Model {
    use Contentable;
}

class Article extends Model {
    use Contentable;

    protected $contentable = 'many';
}