Laravel 雄辩的关系在我的情况下不起作用[重复]

Posted

技术标签:

【中文标题】Laravel 雄辩的关系在我的情况下不起作用[重复]【英文标题】:Laravel eloquent-relationships does not work in my case [duplicate] 【发布时间】:2021-06-01 22:42:00 【问题描述】:

我有两张桌子

订阅表

id char(36) | other column

许可证表

id bigint(20) | license_key (string) | subscription_id char(36)

模型订阅.php

protected $with = ['licenses'];

public function licenses()

        return $this->hasMany('App\License', 'subscription_id');

Eager Loading 适用于大多数情况,但 subscription_id = 6e20af64-81e6-428e-b9db-52317d1e478e

subscription_id = 6e20af64-81e6-428e-b9db-52317d1e478e 存在于许可证表中

这是查询日志:

array:2 [▼
  0 => array:3 [▼
    "query" => "select * from `subscriptions` where `subscriptions`.`id` = ? limit 1"
    "bindings" => array:1 [▼
      0 => "6e20af64-81e6-428e-b9db-52317d1e478e"
    ]
    "time" => 3.9
  ]
  1 => array:3 [▼
    "query" => "select * from `licenses` where `licenses`.`subscription_id` in (9223372036854775807)"
    "bindings" => []
    "time" => 4.73
  ]
]

为什么它不能只使用这个 subscription_id?

我的环境:

"laravel/framework": "6.20.17",

php: 7.4.14

【问题讨论】:

你试过了吗:return $this->hasMany(License::class, 'foreign_key', 'local_key'); ? 正如它所说,// In Laravel 6.0+ make sure to also set $keyType protected $keyType = 'string'; 【参考方案1】:

由于你的主键似乎是一个 UUID,你需要告诉 Laravel 你的 PK 是一个字符串。我为此使用了这个非常方便的特性。它不仅将密钥类型设置为string 并禁止增加 PK,而且还会在创建新模型时生成新的 UUID。

use Illuminate\Support\Str;

trait HasPrimaryUuid

    protected static function bootUsesPrimaryUuid()
    
        static::creating(function ($model) 
            if (!$model->getKey()) 
                $model->$model->getKeyName() = (string)Str::uuid();
            
        );
    

    public function getIncrementing()
    
        return false;
    

    public function getKeyType()
    
        return 'string';
    

只需 use 在您的模型中使用此特征,就像使用其他特征一样:

class MyModel extends Model 
    use HasPrimaryUuid;
    
    // ...


【讨论】:

以上是关于Laravel 雄辩的关系在我的情况下不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7雄辩的关系不起作用

雄辩的一对多关系在生产服务器上不起作用

带有“LIKE”语句的雄辩查询在 Laravel 6 中不起作用

为啥转换在我的情况下不起作用

从 mysql 迁移到 postgresql 时,Laravel 雄辩的 ORM 不起作用

为啥 `async/await` 在我的情况下不起作用?