如何使用CakePHP 3.5将表关联或链接在一起?

时间:2018-01-03 20:07:53

标签: php mysql cakephp

我正在使用最新版本 - 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>

我花了将近一整天的时间研究并试图自己解决这个问题,但没有运气。任何帮助将不胜感激!

1 个答案:

答案 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注释的实体,以显示在实体上命名的关联。