EasyAdmin 3:列表视图仅显示一个实体,计数 = 3
EasyAdmin 3: List view shows only one entity, count = 3
代表实体,通过连接继承映射到用户实体,在列表视图中显示计数为 3 但仅显示一个。代表也与非营利实体存在多对一关系。需要发生什么来显示所有三个代表?
数据库查询序列(在探查器中看到)显示列表视图中对 return 代表的非营利组织 ID 的 6 个查询中的第 6 个。我怀疑这与只显示一个代表这一事实密切相关。
编辑:EA2 中不会出现此行为。只有在迁移到 EA3 之后。
编辑 #2:在 EA2 中有 10 个数据库查询,而在 EA3 中只有 6 个。不同之处在于,在 EA2 中,查询 id 为 1、2 和 3 的非营利组织的属性;在 EA3 中,只有 ID 为 3 的非营利组织的属性查询。
截图:
代表性实体(片段):
/**
* @ORM\Table(name="staff")
* @ORM\Entity
*/
class Representative extends User
{
...
/**
* @ORM\ManyToOne(targetEntity="Nonprofit", inversedBy="reps", cascade={"persist", "remove"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="orgId", referencedColumnName="id")
* })
*/
protected $nonprofit;
...
}
用户实体(片段):
/**
* @ORM\Table(name="usertable")
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"rep" = "Representative", "volunteer" = "Volunteer", "admin" = "Admin"})
*/
abstract class User implements UserInterface
{
...
}
代表 CRUD 控制器:
class RepresentativeCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Representative::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setPageTitle(Crud::PAGE_EDIT, 'Edit %entity_name%')
->setHelp('index', 'Locking staff deactivates nonprofit and blocks staff log in. Replacing also removes current staff.')
->setSearchFields(['id', 'roles', 'email', 'fname', 'sname', 'confirmationToken', 'replacementStatus']);
}
public function configureActions(Actions $actions): Actions
{
return $actions
->disable('new', 'edit', 'delete');
}
public function configureFields(string $pageName): iterable
{
$roles = ArrayField::new('roles');
$password = TextField::new('password');
$email = TextField::new('email');
$fname = TextField::new('fname');
$sname = TextField::new('sname');
$lastLogin = DateTimeField::new('lastLogin');
$confirmationToken = TextField::new('confirmationToken');
$tokenExpiresAt = DateTimeField::new('tokenExpiresAt');
$locked = BooleanField::new('locked');
$enabled = BooleanField::new('enabled');
$replacementStatus = TextField::new('replacementStatus');
$initiated = DateField::new('initiated');
$completed = DateField::new('completed');
$nonprofit = AssociationField::new('nonprofit');
$id = IntegerField::new('id', 'ID');
$replace = TextareaField::new('replace')->setTemplatePath('Admin/replace_staff.html.twig');
$fullName = TextareaField::new('fullName');
$orgname = TextareaField::new('orgname');
if (Crud::PAGE_INDEX === $pageName) {
return [$replace, $fullName, $email, $orgname];
} elseif (Crud::PAGE_DETAIL === $pageName) {
return [$id, $roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
} elseif (Crud::PAGE_NEW === $pageName) {
return [$roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
} elseif (Crud::PAGE_EDIT === $pageName) {
return [$roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
}
}
}
如 GitHub 所述,我假设您的主键 属性 是私有的。使其受到保护应该可以解决问题。
/**
* @ORM\Table(name="usertable")
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"rep" = "Representative", "volunteer" = "Volunteer", "admin" = "Admin"})
*/
abstract class User implements UserInterface
{
protected $id;
}
代表实体,通过连接继承映射到用户实体,在列表视图中显示计数为 3 但仅显示一个。代表也与非营利实体存在多对一关系。需要发生什么来显示所有三个代表?
数据库查询序列(在探查器中看到)显示列表视图中对 return 代表的非营利组织 ID 的 6 个查询中的第 6 个。我怀疑这与只显示一个代表这一事实密切相关。
编辑:EA2 中不会出现此行为。只有在迁移到 EA3 之后。
编辑 #2:在 EA2 中有 10 个数据库查询,而在 EA3 中只有 6 个。不同之处在于,在 EA2 中,查询 id 为 1、2 和 3 的非营利组织的属性;在 EA3 中,只有 ID 为 3 的非营利组织的属性查询。
截图:
代表性实体(片段):
/**
* @ORM\Table(name="staff")
* @ORM\Entity
*/
class Representative extends User
{
...
/**
* @ORM\ManyToOne(targetEntity="Nonprofit", inversedBy="reps", cascade={"persist", "remove"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="orgId", referencedColumnName="id")
* })
*/
protected $nonprofit;
...
}
用户实体(片段):
/**
* @ORM\Table(name="usertable")
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"rep" = "Representative", "volunteer" = "Volunteer", "admin" = "Admin"})
*/
abstract class User implements UserInterface
{
...
}
代表 CRUD 控制器:
class RepresentativeCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Representative::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setPageTitle(Crud::PAGE_EDIT, 'Edit %entity_name%')
->setHelp('index', 'Locking staff deactivates nonprofit and blocks staff log in. Replacing also removes current staff.')
->setSearchFields(['id', 'roles', 'email', 'fname', 'sname', 'confirmationToken', 'replacementStatus']);
}
public function configureActions(Actions $actions): Actions
{
return $actions
->disable('new', 'edit', 'delete');
}
public function configureFields(string $pageName): iterable
{
$roles = ArrayField::new('roles');
$password = TextField::new('password');
$email = TextField::new('email');
$fname = TextField::new('fname');
$sname = TextField::new('sname');
$lastLogin = DateTimeField::new('lastLogin');
$confirmationToken = TextField::new('confirmationToken');
$tokenExpiresAt = DateTimeField::new('tokenExpiresAt');
$locked = BooleanField::new('locked');
$enabled = BooleanField::new('enabled');
$replacementStatus = TextField::new('replacementStatus');
$initiated = DateField::new('initiated');
$completed = DateField::new('completed');
$nonprofit = AssociationField::new('nonprofit');
$id = IntegerField::new('id', 'ID');
$replace = TextareaField::new('replace')->setTemplatePath('Admin/replace_staff.html.twig');
$fullName = TextareaField::new('fullName');
$orgname = TextareaField::new('orgname');
if (Crud::PAGE_INDEX === $pageName) {
return [$replace, $fullName, $email, $orgname];
} elseif (Crud::PAGE_DETAIL === $pageName) {
return [$id, $roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
} elseif (Crud::PAGE_NEW === $pageName) {
return [$roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
} elseif (Crud::PAGE_EDIT === $pageName) {
return [$roles, $password, $email, $fname, $sname, $lastLogin, $confirmationToken, $tokenExpiresAt, $locked, $enabled, $replacementStatus, $initiated, $completed, $nonprofit];
}
}
}
如 GitHub 所述,我假设您的主键 属性 是私有的。使其受到保护应该可以解决问题。
/**
* @ORM\Table(name="usertable")
* @ORM\Entity
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"rep" = "Representative", "volunteer" = "Volunteer", "admin" = "Admin"})
*/
abstract class User implements UserInterface
{
protected $id;
}