#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();