php - 动态列/属性。卡住。需要灵感
问题描述
我正在寻找解决我一段时间以来遇到的问题的方法。也许你可以激励我做得更好。我试图在规划过程中不犯基本错误,因此我向您征求意见。
我有一个 Contact::model,它几乎没有固定属性,如 id 等。此外,我希望为整个 Contact::model 动态创建不同的属性。某些用户将被赋予向整个模型添加名称、电子邮件、地址等属性的功能。我已经放弃了通过创建/删除列以编程方式更新表本身的想法(这会引入不同的问题)。至于现在我已经创建了两个额外的表。一个带有附加列名 [Columns::model] 和一个数据透视表,用于将值分配给 Contact::model 和 Column::model。
要列出所有联系人,我将 ContactColumn 表准备为数组,其中第一个键是 contact_id,第二个是 column_id,因此我得到了值。这引入了 n+1 问题。这不会那么糟糕,但是使用这种方法,通过动态列值、过滤、搜索等对联系人进行排序将非常困难(或消耗资源)。
你能以某种方式指导我找到更好的解决方案。如何将联系人集合与给定列的值合并,使其看起来像一个固定表?
<table>
<thead>
<tr>
<th>Fixed columns [i.e. ID]</th>
@foreach ($columns as $column)
<th>{{ $column->name }}</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach ($contacts as $contact)
<tr>
<td>{{ $contact->id }}</td>
@foreach ($columns as $column)
<td>
@if (array_key_exists($column->id, $values[$contact->id]))
{{ $values[$contact->id][$column->id] }}
@endif
</td>
@endforeach
</tr>
@endforeach
</tbody>
</table>
和$value
阵列。
foreach (ColumnContact::all() as $pivot) {
$values[$pivot->contact_id][$pivot->column_id] = $pivot->value;
}
return $values;
编辑:我已经这样解决了
$this->contacts = Contact::when($this->dynamicColumnName, function($query) {
$query->join('column_contact', function ($join) {
$join->on('id', '=', 'column_contact.contact_id')
->where('column_contact.column_id', '=', $this->dynamicColumnName->id);
})
->orderBy('value', $this->orderingDirection);
})
(...)
->paginate(self::PER_PAGE);
解决方案
除了固定字段外,在您的架构中添加一个额外的 JSON 字段,称为“custom_fields”。看看=> https://github.com/stancl/virtualcolumn
自定义字段的单独表格不是一个好主意,因为您必须单独处理模型事件等等。
推荐阅读
- html - 选择类中的任何最后一个元素
- javascript - vanilla JS悬停在div上更改背景颜色
- excel - 在vba的单元格中的公式中传递变量名
- pandas - 返回常规 dafaframe 的 DataFrame 组
- python - 如果之前的数字是正数或负数,Python 如果分析数字有问题?
- javascript - 如何获取仅包含 Google Drive 中文件夹的直接子级的 FolderIterator
- r - 在条形图中的固定点添加图像
- elm - elm-ui 中心元素在包裹的行中
- python - 安装和运行 PYDOE 的问题
- php - 如何防止提交重复的电子邮件