我正在使用最新版本 - CakePHP 3.5
我需要的是能够链接2个表,作业和类型。主表是作业,我正在尝试通过链接来建立关联。从作业表中检索数据没有问题。看一下index.ctp文件,其中包含绿色类的span。因此,当我尝试加入两个表时,我收到以下通知。
注意(8):尝试获取非对象的属性[APP / Template \ Jobs \ index.ctp,第10行]
以下是我正在使用的所有文件......
JobsController.php
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Network\Exception\ForbiddenException;
use Cake\Network\Exception\NotFoundException;
use Cake\View\Exception\MissingTemplateException;
class JobsController extends AppController
{
public $name = 'Jobs';
/*
*Default Index Method
*/
public function index()
{
//Route Connection to Controller Method
$this->loadComponent('Paginator');
$jobs = $this->Paginator->paginate($this->Jobs->find());
$this->set(compact('jobs'));
//Set Query Options
$options = array(
'order' => array('Jobs.created' => 'desc'),
'limit' => 10
);
//Get Job Info
$jobs = $this->Jobs->find('all', $options);
$this->set('jobs', $jobs);
}
}
JobsTable.php
namespace App\Model\Table;
use Cake\Validation\Validator;
use Cake\ORM\Table;
class JobsTable extends Table
{
public $name = 'Jobs';
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
$this->belongsTo('Types');
}
}
index.ctp
<h3>Latest Job Listings</h3>
<ul id="listings">
<?php foreach($jobs as $job) : ?>
<li>
<div class="type">
<span class="green"><?php echo $job->Types->name; ?></span>
</div>
<div class="description">
<h5><?php echo $job->title; ?> (<?php echo $job->city; ?>, <?php echo $job->state; ?>)</h5>
<span id="list_date">
<small><?php echo $job->created->format('F jS h:i A'); ?></small>
</span>
<p><?php echo $this->Text->truncate($job->description, 250, array('ellipsis' => '...', 'exact' => false)); ?>
<?php echo $this->Html->link('Read More',array('controller' => 'jobs', 'action' => 'view', $job->id)) ?></p>
</div>
</li>
<?php endforeach; ?>
</ul>
我花了将近一整天的时间研究并试图自己解决这个问题,但没有运气。任何帮助将不胜感激!
答案 0 :(得分:1)
您可以使用$paginate
属性在控制器中定义分页关联和选项。
class JobsController extends AppController {
public $paginate = [
'contain'=>['Types'],
'order'=>['Jobs.created' => 'desc'],
'limit'=>10
];
public function index() {
$jobs = $this->paginate($this->Jobs);
$this->set(compact('jobs'));
}
}
BelongsTo 关联作为单数和小写属性附加到实体。所以你会像$job->type->name
一样阅读它。
通过使用烘焙功能创建模型和控制器,您可以节省自己的时间。
bin/cake bake all Types
bin/cake bake all Jobs
这将为Jobs
生成使用Types
包含分页的控制器,并且它还会生成具有phpDoc注释的实体,以显示在实体上命名的关联。