gpt4 book ai didi

php - 关系设计

转载 作者:可可西里 更新时间:2023-10-31 23:19:34 24 4
gpt4 key购买 nike

我正在构建一个应用程序,客户可以在其中根据预定义的模板创建文档,使用自己的文本编辑一些字段并保存。我已经勾勒出我认为的关系,转换成 Laravel 基本上没问题:

enter image description here

我唯一的问题是如何处理 FieldValue 关系。这个想法是模板定义了所有字段,而不是在每个文档上重新创建这些字段,它应该只查看其模板。这意味着 FieldValue 需要查找其文档、模板并从那里找到相应的字段。

是否有一种简洁的方法来实现它,或者是否有更好的方法来设计关系以使其更易于实现?

最佳答案

按照你的图表,看起来像一个带有数据透视表的数据透视表......

在 Laravel 中通常会像这样建模:

class Document extends Model
{
public function template()
{
return $this->belongsTo('App\Template');
}

public function fields()
{
return $this->belongsToMany('App\Field')->withPivot('value');
}
}

class Template extends Model
{
public function organisation()
{
return $this->belongsTo('App\Organisation');
}

public function documents()
{
return $this->hasMany('App\Document');
}

public function fields()
{
return $this->hasManyThrough('App\Field', 'App\Section');
}

public function sections()
{
return $this->hasMany('App\Section');
}
}

class Section extends Model
{
public function fields()
{
return $this->hasMany('App\Document')->withPivot('value');
}

public function template()
{
return $this->belongsTo('App\Template');
}
}

class Field extends Model
{
public function documents()
{
return $this->belongsToMany('App\Document')->withPivot('value');
}

public function section()
{
return $this->belongsTo('App\Section');
}
}

class Organisation extends Model
{
public function documents()
{
return $this->hasManyThrough('App\Document', 'App\Template');
}

public function templates()
{
return $this->hasMany('App\Template');
}
}

与相关表(如果坚持使用 laravel 默认值):

fields
id - integer
section_id - integer

documents
id - integer
template_id - integer

templates
id - integer
organisation_id - integer

sections
id - integer
template_id - integer

organisations
id - integer

document_field
id - integer
document_id - integer
field_id - integer
value - string

然后您可以通过多种不同的方式访问内容。这是一个例子:

$user = App\User::find(3);

$organisation = $user->organisation;

foreach ($organisation->documents as $document)
{
foreach ($document->fields as $field)
{
echo $field->pivot->value;
}
}

并插入:

$field = App\Field::find(2);

$document = App\Document::find(4);

$value = 'My field value';

$document->fields()->save($field, ['value' => $value]);

相关文档:

关于php - 关系设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com