2017-09-07 85 views
1
  • 张贴的hasMany评论

评论(ID,标题,内容,is_main)联营模式。每个帖子至少有一条评论,并且必须有一条评论为主(只有1条评论为主)排序用的hasMany关系CakePHP的3

我需要排序发表评论的标题是主要的,但是按虚拟字段排序似乎已经在Cake中删除3.X

控制器:

$查询= $这个 - >后>找到() - >含有([ “注释”]);

模板:

Paginator->排序( '评论', “评论(县)”) >

+0

所以它是一个虚拟的领域?因为在我的知识中,事实上按虚拟字段排序在蛋糕3中是不可能的 –

+0

你的虚拟场在哪里?看起来你需要从关联模型的字段中排序..不是吗? –

+0

@ManoharKhadka:是的,我需要排序表发表主要评论的名称:( –

回答

1

旧的虚拟字段概念已被删除,但是,定义计算列/选择自定义列是非常有可能的,尽管对于您正在尝试执行的操作而言,并不是必需的。

由于只能有一个主要的意见,你可以简单地离开你的加入Comment(顺便说一句,它应该是CommentsPosts如果你按照CakePHP naming conventions)上状态对应。

$this->paginate = [ 
    // ... 
    'sortWhitelist' => [ 
     // associations and computed columns must be whitelisted, and if 
     // you do that, the valid main model columns must be specified too 
     'id', 
     // ... 
     'Comments.title' 
    ] 
]; 

$query = $this->Posts 
    ->find() 
    ->leftJoinWith('Comments', function (\Cake\ORM\Query $query) { 
     return $query 
      ->where(['Comments.is_main' => true]); 
    }); 

$posts = $this->paginate($query); 
// in your view template 

$this->Paginator->sort('Comments.title', 'Main Comment Title'); 

参见

+0

非常感谢!当你解释它时太清楚了。谢谢!它节省了我的一天! –

+0

是的,这是完美的解决方案和更好的解释。 –

0

在控制器:

$this->paginate = [ 
    'contain'=>['Comments'], 
    'sortWhitelist'=>['Comments.comment'] 
    ]; 

$posts = $this->paginate($this->Posts); 

在模板:

<?= $this->Paginator->sort('Comments.comment') ?> 

请看这里Sorting Contained Associations CakePHP3。

此答案仅适用于hasOne关系。

+0

已尝试您的解决方案,但仍然无法正常工作:(。我想知道我们怎么能知道什么是排序主标题的评论,因为他们有很多评论每个帖子 –

+0

哦,我明白了..你的意思是你有一个主要评论每个帖子和你需要从主要评论进行排序??如果是这样如何将蛋糕知道。可能是你需要尝试其他解决方案然后。 –

+0

是啊兄弟,问题是我们有很多评论每个职位,并按主评论排序。我想必须使用左连接,但我是CakePHP的新手,然后不知道如何 –