Orm cakephp4从包含表中按字段顺序获取第一条记录

Orm cakephp4从包含表中按字段顺序获取第一条记录,orm,relationship,cakephp-4.x,Orm,Relationship,Cakephp 4.x,我有cakephp4项目 在投资组合和psnap之间有一对多的关系 我想显示所有“公文包”,其中包含一条来自PSnaps的相关记录,其中其PSnaps.status=1和order=>['PSnap.order\u at'=>'ASC'] 我做了很多尝试,但都得到了正确的结果 下面给出了90%的正确结果,仅在PSnaps上订购。在上订购不起作用 除了hasmany()之外,我还创建了hasOne()关联,如下面的模型所示 型号 class PortfoliosTable extends Tabl

我有cakephp4项目
投资组合
psnap

之间有一对多的关系 我想显示所有“公文包”,其中包含一条来自
PSnaps
的相关记录,其中其
PSnaps.status=1
order=>['PSnap.order\u at'=>'ASC']

我做了很多尝试,但都得到了正确的结果

下面给出了90%的正确结果,仅在
PSnaps上订购。在
上订购不起作用

除了
hasmany()
之外,我还创建了
hasOne()
关联,如下面的模型所示

型号

class PortfoliosTable extends Table
{ 
   public function initialize(array $config): void
   {
    parent::initialize($config);

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

    $this->hasOne('FirstPSnaps', [
        'className' => 'PSnaps',
        'foreignKey' => 'portfolio_id',
        'strategy' => 'select',//also tried join
        //'joinType'=>'LEFT',//also tried inner,left,right
        //'sort' => ['FirstPSnaps.order_at' => 'ASC'], //*******this is not working
        'conditions' => function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
            $query->order(['FirstPSnaps.order_at' => 'ASC']);//*******also not working
            return [];
        } 
         
    ]) 
    ; 

    $this->hasMany('PSnaps', [
        'foreignKey' => 'portfolio_id',
    ]); 
}
控制器

$pfolios = $this->Portfolios->find('all')
        ->select(['Portfolios.id','Portfolios.client','Portfolios.country','Portfolios.url'])
        ->where(['Portfolios.status'=>1])
        ->order(['Portfolios.order_at'=>'asc','Portfolios.id'=>'asc'])
        ->limit(8)
        ->contain([
            'FirstPSnaps'=>function($q){
                return $q
                    ->select(['FirstPSnaps.portfolio_id','FirstPSnaps.snap'])
                    //->where(['FirstPSnaps.status'=>1])
                    //->order(['FirstPSnaps.order_at'=>'asc'])
                    ;
            } 
        ])
        ->toArray();  
    

它返回了带有1个p_snap记录的正确文件夹,但排序/排序不正确,因为我需要第一个p_snap,例如p_snap.status=1和p_span.portfolio_id=portfolios.id limit 1

您最好在模型中编写一个专用查询,然后只回显每个返回对象中的第一项。检查中的
queryBuilder
功能。我尝试了queryBuilder(),得到了更多的错误您需要更多的技巧才能正常工作,只需对所有记录进行排序和加载,然后在PHP级别上依赖正确的记录,并不是过度建议,请参见。另外-无耻的提前插电-检查,它还不稳定,但你可能会发现它很有用,想试试。