【问题标题】:Get fetched result in different arrays by joined tables通过连接表获取不同数组中的获取结果
【发布时间】: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 好吧​​,这与我的问题无关(或者我可能遗漏了一些东西),但会有一个问题,那就是存在名称相似的列。例如,userpost 都有一个 created_at 列。在查询构建器获取的结果中,第一个(所以,postcreated_at)被usercreated_at 覆盖,在这个特定的用例中,只有created_at 相关的帖子。或者除了定义手动选择具有别名的列之外,还有其他方法吗?我需要同时拥有created_at 结果并知道哪个来自哪个表
  • here

标签: php query-builder cakephp-4.x


【解决方案1】:

正如here 所讨论的那样,我感兴趣的工作流更多地基于“用例”,然后按照我的要求去做没有意义(因为它会重新发明 ORM which I did first)。

对我来说可行的是创建具有高内聚性的特定 DTO,例如 UserPost,在这种情况下,表格的来源与字段无关,因为字段是单独精确选择的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多