【问题标题】:Controller HABTM variables not loading in view控制器 HABTM 变量未加载到视图中
【发布时间】:2019-11-09 17:57:13
【问题描述】:

我在 HasAndBelongsToMany 关联中有两个相关模型:子类别有很多 Paquete,Paquete 有很多子类别。

在我的子类别页面中,我需要加载相关的 paquetes,并且根据我的 debug-kit 工具栏,变量正在正确加载。问题是视图向我显示“未定义的属性”错误代码。我确定我遗漏了一些东西,但我不太明白问题出在哪里。

我的模型:

class SubcategoriasTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('subcategorias');
        $this->setDisplayField('title');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

    $this->belongsTo('Categorias', [
            'foreignKey' => 'categoria_id',
            'joinType' => 'INNER'
        ]);

    $this->belongsToMany('Paquetes');
    }
}

class PaquetesTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('paquetes');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

        $this->belongsToMany('Subcategorias', [
            'foreignKey' => 'paquete_id',
            'targetForeignKey' => 'subcategoria_id',
            'joinTable' => 'paquetes_subcategorias',
        'dependant' => false
        ]);
    }
}

我遇到问题的控制器:

namespace App\Controller;

use App\Controller\AppController;
use Cake\ORM\Query;

class SubcategoriasController extends AppController
{

    public function content($slug = null)
    {
    $subcategory = $this->Subcategorias
            ->findBySlug($slug)
            ->select(['title', 'id'])
            ->contain('Paquetes', function (Query $q) {
                return $q
                    ->select(['name', 'slug','cost','currency'])
                    ->where(['Paquetes.status' => true]);
            });

    $this->set(compact('subcategory',$subcategory));
    }
}

对应的视图模板(content.ctp):

<?php
    $subcategoryName = $subcategory->title;
    $title = $subcategoryName;
    $this->assign('title', $title); 
?>

<h1><?= $title ?></h1>
<?php foreach($subcategory->paquetes as $paquete) : ?>
    <!-- Each Paquete's loaded fields. -->
<?php endforeach; ?>

到目前为止,我收到以下错误消息:

Notice (8): Undefined property: Cake\ORM\Query::$title [APP/Template\Subcategorias\content.ctp, line 2]

【问题讨论】:

    标签: cakephp-3.7


    【解决方案1】:

    您永远不会在您构建的查询上调用first()firstOrFail(),因此在您看来$subcategory 仍然只是一个查询对象,而不是一个实体。

    你的意思可能是:

    $subcategory = $this->Subcategorias
        ->findBySlug($slug)
        ->select(['title', 'id'])
        ->contain('Paquetes', function (Query $q) {
            return $q
                ->select(['name', 'slug','cost','currency'])
                ->where(['Paquetes.status' => true]);
        })
    ->firstOrFail(); // This is the line that fetches the result and marshals it into an Subcategorias Entity 
    

    【讨论】:

    • 我之前曾尝试添加该行,但我没有意识到顺序很重要(它一直向我抛出“调用未定义方法”错误通知)。现在可以了!谢谢!
    • 是的,这些函数中的大多数都返回 Query 对象,因此您可以将它们链接起来,并且顺序并不重要,有些可能会覆盖其他函数,因此请记住这一点。但最后要么调用 first/firstOrFail/toArray,要么使用 foreach 对其进行迭代,最终运行查询并输出结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多