从对象MongoDB和PHP中提取数据(fuelphp)

时间:2011-12-27 20:35:42

标签: php mongodb fuelphp

我正在使用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循环和框架的理解。谢谢。

3 个答案:

答案 0 :(得分:2)

试试这个:

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

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

答案 1 :(得分:1)

我不知道php,但在我看来,你正在迭代结果对象中的所有键值对:

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

为什么不说出

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

然后在视图中获取您想要的数据对象:

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

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

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

-Tyler

答案 2 :(得分:1)

我不熟悉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)