【发布时间】:2021-05-12 14:49:30
【问题描述】:
我想创建一个 Post 对象,其中包含其关联表 User 的一个实例,如果我可以访问用户结果并分别发布结果,那么最简单的方法就是。
查询:
$query = $this->connection->newQuery()->from('post');
$query->select(
[
'post.message',
'post.created_at',
'user.name',
'user.email',
'user.role',
'user.status',
]
)->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',
'user_role' => 'user.role',
'user_status' => 'user.status',
]
)->join(['table' => 'user', 'conditions' => 'post.user_id = user.id']);
$postsRows = $query->execute()->fetchAll('assoc');
但是后来我必须通过它们并稍后手动拆分数组,因为我使用表达式*,所以我无法为帖子列名称加上别名,并且在加入同一个表时它不起作用。
我想理想的输出是以下输出。这样的事情可能吗?
$postsRows = array(
0 => array(
'post' => array(
'message' => 'This is a test post',
'created_at' => '2021-01-01 00:00:01',
),
'user' => array(
'name' => 'Admin Example',
'email' => 'admin@example.com',
'role' => 'admin',
'status' => 'active',
)
),
1 => array(
'post' => array(
'message' => 'This is another test post',
'created_at' => '2021-01-01 00:00:01',
),
'user' => array(
'name' => 'User Example',
'email' => 'user@example.com',
'role' => 'user',
'status' => 'active',
),
),
)
【问题讨论】:
-
当然你知道哪个列来自哪个表。你写了查询。不,您不能翻转开关并使结果看起来像您想要的那样
-
为这些加载整个记录有什么问题?我经常看到人们限制他们选择的列,但这比解决问题更容易引起问题。 (当然在某些情况下限制列是有用的甚至是必要的,但我认为它们非常有限。)
-
@RiggsFolly 只需查看输出数组,如何以编程方式确定哪一列来自哪个表?我需要创建一个 Post 对象和一个 User 对象,为此我必须知道哪个值来自哪个表。
-
@GregSchmidt 好吧,这与我的问题无关(或者我可能遗漏了一些东西),但会有一个问题,那就是存在名称相似的列。例如,
user和post都有一个created_at列。在查询构建器获取的结果中,第一个(所以,postcreated_at)被usercreated_at覆盖,在这个特定的用例中,只有created_at相关的帖子。或者除了定义手动选择具有别名的列之外,还有其他方法吗?我需要同时拥有created_at结果并知道哪个来自哪个表 -
见here
标签: php query-builder cakephp-4.x