Cakephp — отображение данных с использованием ‘foreach’ не возвращает никаких значений

#php #database #cakephp #foreach

#php #База данных #cakephp #foreach

Вопрос:

Я пытаюсь переварить одно из руководств по cakephp, и вчера я застрял. Пример веб-сайта называется Jobfinds, поэтому у меня есть имя таблицы «jobs».

Вот код из JobsController :

     <?php
    namespace AppController;

    use AppControllerAppController;

    class JobsController extends AppController{


    public $name = 'Jobs';

    /*
     * Default Index Method
     */

public function index() {
    //Set Query Options
    $options = array(
        'order' => array('Jobs.created' => 'asc' ),
        'limit' => 4
    ); 

    //Get Job Info

    $jobs = $this->Jobs->find('all', $options);

    $this->set('jobs', $jobs);
  }
}
?>
  

Этот код находится в index.ctp, но он ничего не показывает, но должен.

 <?php foreach($jobs as $job) : ?>
<p><?php  echo $job['jobs']['title'];
 ?> </p>
<?php endforeach; ?>
  

Когда я ставлю, например

 <?php echo "something"; ?>
  

Затем отображается «что-то», поэтому я решил, что должна быть небольшая ошибка, которая не извлекает данные из таблицы. Я пытался слишком долго. Из-за этого я начинаю терять волосы. Этот урок довольно потрясающий, но используется cakephp 2.x, а я использую 3.x. поэтому на каждом шаге мне нужно что-то менять, и до сих пор мне это удавалось, но я придерживался этого навсегда. Любой может увидеть, где виновник? Почему он не извлекает данные из таблицы?

У меня нет ошибок в ЖУРНАЛАХ отладки.

внутренний цикл print_r ($ job) выдает, как показано ниже

     CakeORMEntity Object ( [id] => 1 [category_id] => 7 [user_id] => 1          [type_id] => 1 [company_name] => Tech Guy Computer Services [title] => Senior Graphic Designer [description] =>

Lorem ipsum dolor sit amet(more description in lorem ipsum

[city] => Burlington [state] => MA [contact_email] => contact@employer.com [created] => CakeI18nFrozenTime Object ( [time] => 2014-07-14T00:00:00 00:00 [timezone] => UTC [fixedNowTime] => ) [[new]] => [[accessible]] => Array ( [*] => 1 ) [[dirty]] => Array ( ) [[original]] => Array ( ) [[virtual]] => Array ( ) [[errors]] => Array ( ) [[invalid]] => Array ( ) [[repository]] => Jobs )
CakeORMEntity Object ( [id] => 2 [category_id] => 7 [user_id] => 1 [type_id] => 1 [company_name] => Tech Guy Computer Services [title] => UX Designer [description] =>
  

Комментарии:

1. посмотрите, что print_r ($ job) выдает внутри цикла

2. Я отредактировал свой пост и вставил результат print_r ($ jobs) внизу

3. попробуйте echo $job-> title; и прочитайте документацию cakephp 3

4. Спасибо Salines — echo $job-> title; отлично работает. Я просто подумал, что echo $job [‘title’]; также работает. Я слепо искал в документации, но мне просто нужен был простой ответ. Еще раз спасибо.

Ответ №1:

Попробуйте этот код, он вам поможет.

 <?php foreach($jobs as $job) : ?>
 <p><?php  echo $job['title'];?></p>
<?php endforeach; ?>
  

Спасибо!

Комментарии:

1. Большое вам спасибо, это работает. Теперь я вижу, что мне не нужно было [‘Job’] перед [‘title’] . Интересно, почему я не понял этого несколькими часами раньше.

2. Спасибо вам. Если ответ правильный, значит, вы отметите ответ. Надеюсь, это поможет другим.

3. Я поставил галочку в комментарии, но я новичок здесь ниже 15 баллов, поэтому он был записан, но пока не отображается.

Ответ №2:

В foreach($jobs as $job) , вот $job объект entity, а не простой массив. Вы можете получить значение title с помощью $job->title . Ваш код должен быть

 <?php foreach($jobs as $job) : ?>
 <p><?php  echo $job->title;?></p>
<?php endforeach; ?>
  

Ответ №3:

CakePHP 3 полностью основан на ORM. Объектно-реляционное сопоставление.

Таким образом, вы можете получить к нему доступ с помощью $job->title;

Также обратите внимание, что он также не будет указывать фактическое имя модели. Если вы хотите получить массив, то в конце вашего запроса в контроллере вы можете использовать

$jobs = $this->Jobs->find('all', $options)->toArray();

Действительно, вы должны использовать $jobs = $this->Jobs->find()->limit(4)->order(array('Jobs.created' => 'asc' ))->toArray();