Laravel 的 BackPack:显示两个具有相同名称的字段
BackPack for Laravel: Display two fields with same name
我有:
数据库中的表:
Schema::create('orders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('primary_person');
$table->unsignedBigInteger('secondary_person');
});
Schema::create('persons', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('first_name', 255);
$table->string('last_name', 255);
});
型号:
class Order extends Model
{
use CrudTrait;
protected $table = 'orders';
protected $fillable = [
'primary_person',
'secondary_person',
];
public function primaryPerson()
{
return $this->hasOne(Person::class, 'id', 'primary_person');
}
public function secondaryPerson()
{
return $this->hasOne(Person::class, 'id', 'secondary_person');
}
}
需要做什么:
页面编辑顺序我想显示两个人的信息:
- 主要人物的名字
- 主要人物的姓氏
- 次要人物的名字
- 次要人物的姓氏
我做了什么:
在OrderCrudController.php中添加:
$this->crud->addFields([
[
'label' => 'First Name of Primary person',
'type' => 'text',
'name' => 'first_name',
'entity' => 'primaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'Last Name of Primary person',
'type' => 'text',
'name' => 'last_name',
'entity' => 'primaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'First Name of Secondary person',
'type' => 'text',
'name' => 'first_name',
'entity' => 'secondaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'Last Name of Secondary person',
'type' => 'text',
'name' => 'last_name',
'entity' => 'secondaryPerson',
'model' => 'App\Models\Person',
]
]);
我收到了什么:
只有最近两个字段(次要人物信息)。
我想看的
主要问题:
我无法显示具有相同 "name" 的字段,因为 "name" - 属性 (数据库中的列),这也将成为输入的名称。
在 Columns 中,这种情况使用 "key" 属性处理。 但在字段中它不起作用。
的确,两个字段不能同名。在列中可以使用 key
属性,但正如您所提到的,在 create/update 表单中这是一个问题,因为 HTML 表单的工作方式:只会传递最后一个输入的值到PHP,存储到数据库中。
我建议您使用 accessors & mutators 解决此问题。您可以将第二个字段命名为其他名称,即使数据库中不存在该列。然后在你的模型中有一个 ```setSecondFirstName($value)```` 方法,它接受那个值并按照你想要的方式保存它。
希望对您有所帮助。
可能的解决方案——使用访问器和修改器(非常感谢@tabacitu)。
https://dev.to/sergunik/how-to-display-two-fields-with-same-name-in-backpack-for-laravel-8b1
我有:
数据库中的表:
Schema::create('orders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('primary_person');
$table->unsignedBigInteger('secondary_person');
});
Schema::create('persons', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('first_name', 255);
$table->string('last_name', 255);
});
型号:
class Order extends Model
{
use CrudTrait;
protected $table = 'orders';
protected $fillable = [
'primary_person',
'secondary_person',
];
public function primaryPerson()
{
return $this->hasOne(Person::class, 'id', 'primary_person');
}
public function secondaryPerson()
{
return $this->hasOne(Person::class, 'id', 'secondary_person');
}
}
需要做什么:
页面编辑顺序我想显示两个人的信息:
- 主要人物的名字
- 主要人物的姓氏
- 次要人物的名字
- 次要人物的姓氏
我做了什么:
在OrderCrudController.php中添加:
$this->crud->addFields([
[
'label' => 'First Name of Primary person',
'type' => 'text',
'name' => 'first_name',
'entity' => 'primaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'Last Name of Primary person',
'type' => 'text',
'name' => 'last_name',
'entity' => 'primaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'First Name of Secondary person',
'type' => 'text',
'name' => 'first_name',
'entity' => 'secondaryPerson',
'model' => 'App\Models\Person',
],
[
'label' => 'Last Name of Secondary person',
'type' => 'text',
'name' => 'last_name',
'entity' => 'secondaryPerson',
'model' => 'App\Models\Person',
]
]);
我收到了什么:
只有最近两个字段(次要人物信息)。
我想看的
主要问题:
我无法显示具有相同 "name" 的字段,因为 "name" - 属性 (数据库中的列),这也将成为输入的名称。
在 Columns 中,这种情况使用 "key" 属性处理。 但在字段中它不起作用。
的确,两个字段不能同名。在列中可以使用 key
属性,但正如您所提到的,在 create/update 表单中这是一个问题,因为 HTML 表单的工作方式:只会传递最后一个输入的值到PHP,存储到数据库中。
我建议您使用 accessors & mutators 解决此问题。您可以将第二个字段命名为其他名称,即使数据库中不存在该列。然后在你的模型中有一个 ```setSecondFirstName($value)```` 方法,它接受那个值并按照你想要的方式保存它。
希望对您有所帮助。
可能的解决方案——使用访问器和修改器(非常感谢@tabacitu)。
https://dev.to/sergunik/how-to-display-two-fields-with-same-name-in-backpack-for-laravel-8b1