在Blade视图中保留前导零



我正在使用Blade视图编写Laravel 7应用程序。我的一个MySQL表包含客户端tools,它有一个不遵循特定模式的id(重组这些id是不讨论的,因为它们来自另一个系统,客户端不会更改(。其中一些id具有前导零,该前导零应该显示在所有视图中,例如055A。

id用前导零存储在数据库中(varchar(64((,没有问题。但是,当刀片视图显示id时,前导零消失了,此外,到editdelete的链接类似于myapp/public/tool/5A5/edit,这导致了错误ofc。

我的方法是用<td>{{ sprintf('%04d', $tool->id) }}</td>显示id,但并不是所有的id都有4个字符,而且链接仍然像myapp/public/tool/5A5/edit,因为Blade使用了整个$tool对象。以下是我的观点:

@foreach($tools as $tool)
<tr>
<td>{{ sprintf('%04d', $tool->id) }}</td> //not enough!
<td>{{ $tool->title }}</td>
<td style="text-align: center;">{{ $tool->tooltype->name }}</td>
@can('manage-tools', AppUser::class)
<td class="td-actions text-right">
<form action="{{ route('tool.destroy', $tool) }}" method="post">
@csrf  
<a rel="tooltip" class="btn btn-success btn-link" href="{{ route('tool.edit', $tool) }}" data-original-title="" title="">
<i class="material-icons">edit</i>
<div class="ripple-container"></div>
</a>
@method('delete')
<button type="button"  value="disabled" disabled class="btn btn-danger btn-link" data-original-title="" title="delete" 
onclick="confirm('{{ __("Wirklich löschen?") }}') ? this.parentElement.submit() : ''">
<i class="material-icons">close</i>
<div class="ripple-container"></div>
</button>
</form>
</td>
@endcan
</tr>
@endforeach

来自我的工具控制器:

public function index(Tool $model)
{
$this->authorize('manage-tools', User::class);
return view('tools.index',['tools' => $model->get()]); 
}

Laravel会做一些"魔术;在后台优雅地处理id字段,例如去掉前导零。由于在大多数情况下,模型id都是递增的,因此默认情况下会出现这种行为。您可以在没有递增id字段的模型上使用以下设置禁用此行为。在您的情况下:

class Tool extends Model
{
public $incrementing = false;
....

这里只需要注意那些必须在双胡子中保留前导零的人。我使用的是Laravel 8,通过添加protected $casts = ['id_column_name' => 'array']可以帮助我防止刀片删除前导零,因此编辑页面的链接可以正确工作。

最新更新