【问题标题】:MySQL Join PHP PDO as sub objectMySQL加入PHP PDO作为子对象
【发布时间】:2017-06-12 14:55:46
【问题描述】:

寻找一种通过一次数据库调用而不是两次数据库调用来按预期输出 PHP 对象的方法。

第一个表是pages 第二个是meta

我想将每个页面的元数据应用到 pages 对象。目前,我可以通过对每个页面记录执行额外的数据库调用或对 PHP 中的每个函数进行一些冗长的操作来做到这一点。

我追求的输出是 $pages->meta->{contains all the meta for that page} 。有没有办法通过一个数据库调用来做到这一点并以这种格式输出数据。

包括我的 fetchAll PHP 函数:

function fetchAll($table,$fields,$where,$order){

    global $db;

    $sql = "SELECT $fields FROM $table";

    if($where){
        $sql .= " WHERE $where";
    }

    if($order){
        $sql .= " ORDER BY $order";
    }

    $stmt = $db->prepare($sql);

    $stmt->execute();

    return $stmt->fetchAll(PDO::FETCH_OBJ);

}

然后

 $pages = fetchAll("pages","*","type = 'example'");

 foreach($pages as $page){

     $page->meta = fetchAll("meta","text,lang,tag", "pages_ID = '$page->ID'");
 }

表结构

页面

ID | type | uri | 

ID | pages_ID | type | tag | lang | text

【问题讨论】:

  • 为什么不在两个表之间进行内部连接?
  • 这会给我所有的数据,但不会按照我在 $page->meta 对象中的方式进行结构化。在 meta 中也有与 pages 同名的列标题。
  • 你能给我们你的两个表的结构以及你想要的输出吗?这将有助于制定适当的查询。
  • 表结构更新
  • 将元属性放在公共而不是私有

标签: php mysql join pdo


【解决方案1】:
  • 在需要时将 db 作为参数传递,不要将其用作全局参数。
  • 仅通过 db 连接、sql 语句来获取函数 并且,最终,一个包含要绑定到的值的绑定数组 语句参数。见PDOStatement::bindValue
  • 保持操作简单。如果你像以前一样使用它们,那么你就是 进入查询生成器方向。因为你没有,那么 我建议事先构建 sql 语句并将其传递给 需要的功能 - 在你的情况下在这里fetchAll()。在所有 PHP MVC 中 项目/框架,你会看到 sql 语句是用 查询构建器并作为一个整体传递给所有 CRUD 函数。

这里是fetchAll() php 函数:

/*
* Don't use any globals in your codes.
* Open your db connection before calling fetchAll()
* and pass it as argument, for example.
*/
function fetchAll($db, $sql, $bindings = array()){
    $stmt = $db->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_OBJ);
}

这是你的更多 php 代码:

// Get all pages (to which meta data exists) and,
// for each of them, the meta details.
$sql = 'SELECT
            pg.*, 
            mt.text,
            mt.lang,
            mt.tag
        FROM pages AS pg
        LEFT JOIN meta AS mt ON mt.pages_ID = pg.ID
        WHERE 
            pg.type = "example"
            AND mt.ID IS NOT NULL';

// Fetch all meta data from db.
$pagesAndMeta = fetchAll($db, $sql);

欢迎进一步提问。祝你好运!

编辑 1(最终):

我在我的数据库上进行了测试,我决定只给你一个(最终)版本的 sql 语句来使用(我删除了另一个)。我还在WHERE 子句中包含了进一步的过滤。现在应该可以顺利运行了。

我还把$page->meta改成了$pagesAndMeta

而且,由于 db 调用完全改变了,所以我建议你通过循环从新的 db 调用结果中构建 $pages 和 $page->meta 对象,你喜欢怎么做。

【讨论】:

  • @Mikey 确实如此。我相信它们会有一些用处——我现在不知道是哪一个,但它们绝对可以成为一个……陷阱。我很感激,谢谢。
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2015-09-14
  • 2013-02-24
相关资源
最近更新 更多