Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用接口时如何定义关系_Php_Laravel_Inheritance_Laravel 5 - Fatal编程技术网

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

Php 使用接口时如何定义关系,php,laravel,inheritance,laravel-5,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_

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
类,但如果可能的话,我希望避免这种情况


也许这能更好地解释我的问题

类文章扩展了模型{
公共函数contentEntities(){
返回$this->hasMany(ContentEntity::class);
}
}
类ContentEntity扩展模型{
公共职能可满足(){
返回$this->morphTo();
}
}
类内容扩展模型{
公共函数contentEntity(){
返回$this->morphOne(ContentEntity::class,'contentable');
}
}
类视频扩展模型{
公共函数contentEntity(){
$this->morphOne(ContentEntity::class,'contentable');
}
}
这管用,但我觉得很不干净。我认为管理
ContentEntity
父级会增加太多开发人员开销

编辑:
除非有人提供更好的解决方案,否则我使用的是EAV风格的解决方案,使用
ContentEntity
s.

您始终可以提取与特征的关系,以便于将来的维护和扩展:

特质

然后,您只需在各种实体中使用该特性:

型号


请发布一些代码,你的
文章
contentA
contentB
@MohamedKawsara我认为我添加的表应该有助于澄清我的问题。我已经将其标记为程序员交换,因为它对于SOI来说有点离题如果你不想使用由许多人变形的
那么你说你有动态模型?您也在动态地为这些模型创建表?content_1和content_2它们的结构大致相同?如果必须用代码描述这些表,您会说存在Abstract表content and content_1也扩展了content和content_2吗?
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';
}