Извлечение данных из объекта MongoDB и PHP (fuelphp) - PullRequest
1 голос
/ 28 декабря 2011

Я использую 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 петли и рамки в целом.Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Попробуйте это:

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

Также возможно передать полные объекты в шаблон вместо того, чтобы сначала преобразовать его в массив.

1 голос
/ 04 января 2012

Я не знаком с 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>

EDIT:

Дополнительная информация , на которой основан этот ответ: (Предполагается, что FuelPHP похож на CodeIgniter, которым он выглядит)

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

при передаче в представление становится:

$ some_item (что соответствует some_val) и $ some_item2 (что соответствует some_val2)

1 голос
/ 28 декабря 2011

Я не знаю php, но мне кажется, что вы перебираете все пары ключ-значение в результирующих объектах:

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

Почему бы просто не сказать

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

Затем выведите нужные вещи из объекта данных в представлении:

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

Опять же, я понятия не имею, так ли это, как вы делаете это в php, но идея в том, что вы хотите зацикливаться на результатах и ​​затем обращаться к атрибутам каждого объекта, а не перебирать атрибуты.

Обновлено: исправлена ​​часть кода, я предполагаю, что Fuel каким-то образом передает локальные переменные, например данные, в представление, но, возможно, это не так.

* 1014 Тайлер *

...