Php 通过联接表在不同数组中获取获取的结果

Php 通过联接表在不同数组中获取获取的结果,php,query-builder,cakephp-4.x,Php,Query Builder,Cakephp 4.x,我想创建一个Post对象,其中包含其关联表User的一个实例,最简单的方法是,如果我可以分别访问用户结果和Post结果 查询: $query=$this->connection->newQuery()->from('post'); $query->select( [ “post.message”, “post.created_at”, “user.name”, “user.email”, “user.role”, “用户状态”, ] )->join(['table'=>'user','condi

我想创建一个
Post
对象,其中包含其关联表
User
的一个实例,最简单的方法是,如果我可以分别访问用户结果和Post结果

查询:

$query=$this->connection->newQuery()->from('post');
$query->select(
[
“post.message”,
“post.created_at”,
“user.name”,
“user.email”,
“user.role”,
“用户状态”,
]
)->join(['table'=>'user','conditions'=>'post.user_id=user.id']);
$postsRows=$query->execute()->fetchAll('assoc');
上面的查询输出一个结果行数组,我无法知道该列是来自
user
表还是
post

$postsRows = array (
  0 => 
  array (
    'message' => 'This is a test post',
    'created_at' => '2021-01-01 00:00:01',
    'name' => 'Admin Example',
    'email' => 'admin@example.com',
    'role' => 'admin',
    'status' => 'active',
  ),
  1 => 
  array (
    'message' => 'This is another test post',
    'created_at' => '2021-01-01 00:00:01',
    'name' => 'User Example',
    'email' => 'user@example.com',
    'role' => 'user',
    'status' => 'active',
  ),
)
当然,我可以为每列创建别名

$query=$this->connection->newQuery()->from('post');
$query->select(
[
“post.*”,
'user_name'=>'user.name',
'user_email'=>'user.email',
“用户角色”=>“用户角色”,
“用户状态”=>“用户状态”,
]
)->join(['table'=>'user','conditions'=>'post.user_id=user.id']);
$postsRows=$query->execute()->fetchAll('assoc');
但随后我必须遍历它们并手动拆分数组,因为我使用表达式
*
,所以无法为post列名添加别名,并且在加入同一个表时也无法工作

我想最理想的是以下输出。这样的事情可能吗

$postsRows=array(
0=>数组(
'post'=>数组(
'消息'=>'这是一个测试帖子',
'已创建于'=>'2021-01-01 00:00:01',
),
“用户”=>数组(
“名称”=>“管理示例”,
'电子邮件'=>'admin@example.com',
'角色'=>'管理员',
'状态'=>'活动',
)
),
1=>数组(
'post'=>数组(
'消息'=>'这是另一个测试帖子',
'已创建于'=>'2021-01-01 00:00:01',
),
“用户”=>数组(
“名称”=>“用户示例”,
'电子邮件'=>'user@example.com',
'角色'=>'用户',
'状态'=>'活动',
),
),
)
如前所述,我感兴趣的工作流程更多地是基于“用例”的,然后按照我的要求去做是没有意义的(因为这有点像是在重塑ORM)


对我来说,有效的方法是创建具有高内聚性的特定DTO,如
UserPost
,在这种情况下,表的来源是不相关的,因为字段是单独选择的。当然,您知道哪个列来自哪个表。您编写了查询。不,你不能扳动开关,让结果看起来像你想要的那样加载这些的整个记录有什么问题?我经常看到人们限制他们选择的栏目,但这往往会导致问题,而不是解决问题。(当然,在某些情况下,限制列是有用的,甚至是必要的,但我认为它们非常有限。)@RiggsFolly仅查看输出数组如何通过编程确定哪一列来自哪一个表?我需要创建一个Post对象和一个User对象,为此,我必须知道哪个值来自哪个表。@GregSchmidt好吧,这与我的问题无关(或者可能我遗漏了什么),但会有一个问题,那就是有一些列具有类似的名称。例如,
user
post
都在列中创建了一个
。在querybuilder获取的结果中,第一个(因此,
post
created\u at
)被
用户
created\u at
覆盖,在这个特定用例中,只有post
created\u at
相关。或者,除了用别名手动定义select列之外,还有其他解决方法吗?我需要在
结果中创建两个
,并知道哪个是来自哪个表的