【问题标题】:Simple ORM in PHP MySQL update joined tablesPHP MySQL 中的简单 ORM 更新连接表
【发布时间】:2012-02-25 17:53:47
【问题描述】:

我目前正在尝试使用 PHP 和 mysql 编写一个简单的 ORM。我希望 orm 类能够使用连接表。 所以这是我的问题,下面的代码显示了我如何将查询产生的数据映射到数组中。

public function execute_query($db_connection)
{
    $query = '';

    foreach($this->sql_query as $query_part)
        $query .= $query_part;

    $result = $db_connection->query($query);
    while($row = $result->fetch_assoc())
    {
        array_push($this->m_Data, $row);
    }
}

db_connection 是一个 mysqli 对象。 sql_query 包含所有不同的查询部分(例如 sql_query['join'] 等)。 m_Data 是包含从 db 读取的数据的数组。

我现在的具体问题是,当我在查询中使用连接语句时,此函数只会覆盖我的 m_Data 数组中具有相同名称的字段。此外,如果我不保存特定字段数据来自的表的名称,我以后将无法使用相同的连接语句更新表。

tl,博士。我不仅需要能够像这样保存表数据:m_Data{ 'field_name' => 'value' },而且还需要保存从中选择字段的表名。然后我可以像这样保存数据 m_Data{ 'table_name.field_name' => 'value' } 这使我以后能够生成查询以成功更新连接的表。

我似乎找不到任何有关如何获取我从结果中提取的每个字段的原始表名称的信息。

如果 mysqli 不可能,如果您指出我正确的方向,我将不胜感激。

额外的简短问题陈述: 我需要得到一个结果集并单独读取每一行。对于每一行,我需要为每个选定的字段提供以下信息:field_name、table_name、value。

这一定有一个简单的答案,但我似乎在寻找错误的关键字来找到解决方案。

我希望我写得足够好理解。

【问题讨论】:

  • 我已经添加了一个答案,但是如果您要澄清是否打算保留每个表的列名,这可能会很有用 - 无论是从像 Propel 这样的构建过程,还是从查询 db 结构实时。
  • 顺便说一句 - 我希望你这样做只是为了体验!但是,如果您正在为 PHP 编写新的 ORM,请记住其中有很多 - 确保您没有重新发明轮子 :)
  • 是的,我这样做只是为了体验。我已经有一段时间没有使用 php 了,而且我从来没有在 OO 风格中使用过它。所以我目前正在构建一个简单的 MVC 框架和这个 ORM 来深入研究这个问题。因为我通过潜入一个项目并克服我面临的问题来学得最好。再次感谢您的帮助:)

标签: php mysql join orm


【解决方案1】:

在我看来,您应该将表列值存储在一个对象中,因此如果您有一个相关表,列值将存储在一个单独的对象中 - 因此不会干扰主表中的值。

一般而言,您可以通过这种方式使用 ORM:

// Make joined query
$rows = ...

foreach($rows as $row)
{
    // $row just refers to the primary table
    echo $row->id;

    // You get a many:1 related table this way
    echo $row->getRelatedRow()->value;

    // You get a 1:many rows this way
    $rows = $row->getOtherRelatedRows();
}

根据您设置查询选项的方式,获取相关数据可能会或可能不会启动进一步的 SELECT 以获取所需数据。

【讨论】:

  • 听起来不错,我想我会这么做的。但这仍然留下了我可能微不足道的基本问题。如何从 mysqli 对象的结果集中读出一行中字段的三个数据值(表名、字段名、值)?如果不可能,我会切换到其他方法没问题。我找不到有关如何执行此操作的任何信息。我得到的最接近的是读取整行的表名。如果你加入两个表,这不会总是一样的。
  • 查看我对您关于已知表结构的问题的评论。如果您的 ORM 知道表是什么样子,它可以执行SELECT t1.a, t1.b, t2.a FROM t1 INNER JOIN t2 ON (...),然后将结果作为索引数组而不是关联数组获取。然后,您可以将每一位数据存储在适当的对象中。
  • 谢谢你,你真的帮了我很多。我不知何故认为我的 orm 不需要知道表结构,我试图解决这个缺陷。在你提到它之后,我又回到了绘图板上。
【解决方案2】:

mysqli_result::fetch_fields有有用的东西:

http://www.php.net/manual/en/mysqli-result.fetch-fields.php

  • 表格
  • 组织表
  • 字段类型

【讨论】:

  • 是的,如果OP没有记录表结构,他可能不得不做这样的事情。它会更慢 - 虽然它当然可以以某种方式缓存。
  • 是的,这行得通,我已经使用 fetch_fields 尝试过,但性能并不令人满意。所以我刚刚做到了,所以 ORM 知道像 halfer 建议的表结构。这也允许我为列分配别名,使我能够选择具有相同名称的多个列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多