【问题标题】:Extract data out of object MongoDB and PHP (fuelphp)从对象 MongoDB 和 PHP (fuelphp) 中提取数据
【发布时间】:2011-12-27 20:35:41
【问题描述】:

我正在使用 MongoDB 和 FuelPHP。我成功连接到 MongoDB 并且可以提取数据。我已经花了三天时间试图弄清楚如何将数据注入视图。 我的看法是这样的:

<body>
<div class="middle">
    <p><?php if (isset($_id)){echo $_id;} ?></p>
    <p><?php if (isset($first_name)){echo $first_name;} ?></p>
    <p><?php if (isset($last_name)){echo $last_name;} ?></p>
</div>
</body>

我的控制器是:

class Controller_Home extends Controller {

public function action_index()
{
    $data['css'] = Asset::css(array('reset.css','main.css'));
    $results = Model_Home::get_results();

            //I thought all I have to do is this foreach loop and it would work
    foreach($results as $row => $val){
        $data = $val;
    }

    $this->response->body = View::factory('home/index', $data);
}
}

我的 var_dump() 是:

        object(stdClass)#10 (2) {
      [0]=>
      array(5) {
        ["_id"]=>
        object(MongoId)#13 (1) {
          ["$id"]=>
          string(24) "4ef82a27b238f02ed9000000"
        }
        ["cms"]=>
        array(1) {
          [0]=>
          string(8) "Druapl_1"
        }
        ["first_name"]=>
        string(6) "Name_1"
        ["last_name"]=>
        string(10) "Lst_Name_1"
        ["skills"]=>
        array(3) {
          [0]=>
          string(6) "html_1"
          [1]=>
          string(5) "css_1"
          [2]=>
          string(8) "jQuery_1"
        }
      }
      [1]=>
      array(5) {
        ["_id"]=>
        object(MongoId)#14 (1) {
          ["$id"]=>
          string(24) "4ef81a0dcf163c7da3e5c964"
        }
        ["cms"]=>
        array(1) {
          [0]=>
          string(8) "Druapl_2"
        }
        ["first_name"]=>
        string(6) "Name_2"
        ["last_name"]=>
        string(10) "Lst_Name_2"
        ["skills"]=>
        array(3) {
          [0]=>
          string(6) "html_2"
          [1]=>
          string(5) "css_2"
          [2]=>
          string(8) "jQuery_2"
        }
      }
    }

现在,它确实有效,但出于某种原因,我只在视图中看到了第一项:

4ef81a0dcf163c7da3e5c964

Name_2

Lst_Name_2

html_2

css_2

jQuery_2

Druapl_2

我认为我的老对手 foreach 循环中出现了严重错误...... 请帮忙,这肯定会帮助我提高对对象、foreach 循环和一般框架的理解。谢谢。

【问题讨论】:

  • 我们需要更多信息。请通过 db.collection.findOne() 向我们展示集合中的完整文档以及通过 github 提供的完整代码,以便我们尝试重现。

标签: php mongodb fuelphp


【解决方案1】:

试试这个:

foreach($results as $row => $val)
{
    $data[$row] = $val;
}

也可以将完整的对象传递给模板,而不是先将其转换为数组。

【讨论】:

  • 嗨,你的方法没有给我错误,所以这是一件好事。但我的观点现在是空的。我是否需要以某种方式重组我的观点。您还提到“也可以将完整的对象传递给模板”我该怎么做?我觉得这是我唯一的希望。到目前为止,我已经尝试了很多东西...请告诉我。同时我会继续寻找。
  • 你知道 julesj,它确实有效。当我执行 print_r($data["0"]) 和 print_r($data["0"]) 时,我看到了我的数据,但它在控制器中的某处丢失以查看传输。或者看起来……
  • 我认为你正在做一些事情 julesj。但是您知道如何将这些数据传递到视图中吗?我有点可以做到,但我的方法不友好,不动态......
  • $data中的key是你视图中的变量名。所以,如果你通过$data['id'],你可以在你的视图中使用echo $id
  • 你的 Mongo 结果对象有多个层级,所以foreach 循环不会成功地'array-fy'整个对象。
【解决方案2】:

我不熟悉 FuelPHP,但您的 $data 变量似乎格式不正确。你有:

foreach($results as $row => $val){
    $data = $val;
}

您很可能需要它(每次抓取新行时都会覆盖值):

foreach($results as $row => $val){
    $data['results'][$row] = $val;
}

那么在你看来,你应该有类似的东西(你没有迭代你的结果):

<body>
<div class="middle">
<?php foreach($results as $result): ?>
    <p><?php if (isset($result['_id'])){echo $result['_id'];} ?></p>
    <p><?php if (isset($result['first_name'])){echo $result['first_name'];} ?></p>
    <p><?php if (isset($result['last_name'])){echo $result['last_name'];} ?></p>
<?php endforeach; ?>
</div>
</body>

但是,这过于复杂,因为您要对数据进行两次迭代。您更好的方法可能如下:

//Replace this:
foreach($results as $row => $val){
    $data['results'][$row] = $val;
}

//with this:
$data['results'] = $results;

然后在您的视图中执行以下操作:

<body>
<div class="middle">
<?php foreach($results as $result): ?>
    <p><?php if (isset($result['_id'])){echo $result['_id'];} ?></p>
    <p><?php if (isset($result['first_name'])){echo $result['first_name'];} ?></p>
    <p><?php if (isset($result['last_name'])){echo $result['last_name'];} ?></p>
<?php endforeach; ?>
</div>
</body>

编辑:

其他信息,此答案所依据的:(假设 FuelPHP 看起来像 CodeIgniter)

$data['some_item'] = some_val;
$data['some_item2'] = some_val2;

当传递给视图时变为:

$some_item(相当于 some_val)和 $some_item2(相当于 some_val2)

【讨论】:

  • 是的,谢谢你在控制器中工作:foreach($results as $row => $val){ $data['results'][$row] = $val; } :and this in view:

    谢谢!
  • 您的第二个选项在控制器中也起作用: $data['results'] = $results;并在视图中:

【解决方案3】:

我不了解 php,但在我看来,您正在遍历结果对象中的所有键、值对:

foreach($results as $row => $val)
{
    $data = $val;
}

为什么不直接说

foreach($results as $obj)
{
    $data = $obj
}

然后从视图中的数据对象中取出你想要的东西:

<?php if (isset($data['_id'])){echo $data['_id'];} ?>

同样,我不知道你在 php 中是否这样做,但我的想法是你想要循环遍历结果,然后访问每个对象的属性,而不是遍历属性。

更新:修复了一些代码,我假设燃料以某种方式将数据等局部变量传递给视图,但也许它没有。

-泰勒

【讨论】:

  • 谢谢 Tyler,刚试了下,好像不行。得到这个错误“ErrorException [解析错误]:语法错误,意外'。',期待','或')'”然后我尝试了这个:echo $data ['_id'];我得到 ErrorException [ Notice ]: Undefined variable: data.无论如何感谢您的尝试。我会继续寻找。我明白你在说什么,但 PHP 也不是我的强项。
  • 抱歉,祝你好运。我可以建议在这里阅读 MongoDB PHP 驱动程序的文档:php.net/manual/en/mongo.tutorial.php
  • 太好了,谢谢。我不确定我是如何忽略这一点的。但是,经过它之后,我可以选择数据库和集合,但我遇到了和以前一样的问题,只显示一条记录。要么某处有错误,要么我根本没有做正确的事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多