z-song / laravel-admin

Build a full-featured administrative interface in ten minutes
https://laravel-admin.org
MIT License
11.14k stars 2.81k forks source link

一对多关联,发现问题 #5829

Closed SiGool closed 12 months ago

SiGool commented 12 months ago

Description:

一对多关联出现问题。 模型定义了一个belongsTo关系方法不生效,idStr是关联目标表的唯一键并不是primary key

public function liveStreamingPlatform() {
         // 我这里$ownerKey参数传入idStr
        $this->belongsTo(Platform::class, 'live_streaming_platform_idStr', 'idStr')
}     

Steps To Reproduce:

调试发现问题:

$relation->getRelated()->getKeyName()

源码使用以上:从模型返回的relation对象获取目标关联模型,然后目标关联模型调 getKeyName方法会返回默认的主键:id。就是说如果刚好跟我一样,目标关联模型如果没有设置 $primaryKey属性,我这里是要设置成idStr。否则就会跟预期不生效了,因为他总会返回$primaryKey属性值无视我传入的$ownerKey参数

解决建议: 方法一,待测试稳定:


public function liveStreamingPlatform() {
       return tap($this->belongsTo(Platform::class, 'live_streaming_platform_idStr', 'idStr'), function(BelongsTo $r) {
            $r->getRelated()->setKeyName($r->getOwnerKey());
        });
    }

我现在 通过 返回这个关联对象前,设置正确这个关联目标模型的$primaryKey属性

方法二:

$relation->getOwnerKey()

// 获取回传入的$ownerKey参数,不要再去获取目标关联模型的主键

建议优化下,这个问题