问题描述
我想创建一个包含其关联表 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','name' => 'User Example','email' => 'user@example.com','role' => 'user',)
自然我可以为每一列做别名
$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','conditions' => 'post.user_id = user.id']);
$postsRows = $query->execute()->fetchAll('assoc');
但是后来我必须遍历它们并稍后手动拆分数组,我无法为帖子列名称设置别名,因为我使用表达式 *
并且在加入同一个表时它不起作用。
我想最理想的是以下输出。这样的事情可能吗?
$postsRows = array(
0 => array(
'post' => array(
'message' => 'This is a test post','user' => array(
'name' => 'Admin Example',)
),1 => array(
'post' => array(
'message' => 'This is another test post','user' => array(
'name' => 'User Example',)
解决方法
正如 here 所讨论的那样,我感兴趣的工作流更多地基于“用例”,然后按照我的要求去做是没有意义的(因为它会重新发明 ORM {{3} }).
对我有用的是创建具有高内聚性的特定 DTO,例如 UserPost
,在这种情况下,表的来源不相关,因为字段是单独精确选择的。