通过连接表获取不同数组中的提取结果

问题描述

我想创建一个包含其关联表 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,在这种情况下,表的来源不相关,因为字段是单独精确选择的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...