Laravel 9中如何获取模型关联关系里设置的自定义外键
在Laravel 9中获取模型关联关系里指定的外键
问题原因
你之前调用的$q->first()->autopays()->getRelated()->getForeignKey(),本质是获取关联模型(ClientAutoPay)的默认外键,这个值是Laravel根据模型名自动生成的(模型名小写_id),和你在hasMany关联里手动指定的client_id没有关系。
正确解决方案
要获取关联关系中明确设置的外键,需要直接操作关联实例,而不是关联模型。Laravel的关联类(比如HasMany)提供了专门的方法或属性来获取这些值:
代码示例
// 获取Client模型实例 $client = Client::query()->first(); // 获取autopays关联的实例(注意不要加()之后的get()/first(),那样会返回集合/模型) $autopaysRelation = $client->autopays(); // 获取关联中设置的外键:client_id $foreignKey = $autopaysRelation->getForeignKeyName(); // 或者直接访问关联实例的foreignKey属性 $foreignKey = $autopaysRelation->foreignKey; // 如果需要获取关联的本地键(即Client模型的id) $localKey = $autopaysRelation->getLocalKeyName(); // 或者直接访问localKey属性 $localKey = $autopaysRelation->localKey; dump($foreignKey); // 输出 "client_id" dump($localKey); // 输出 "id"
结合你的动态左连接场景
可以把逻辑整合到你的循环中,比如:
// 假设你有多个关联需要处理,这里以autopays为例 $joinFunc = [ $client->autopays()->getRelated()->getTable() => [ 'related' => $client->getTable(), 'oKey' => $client->autopays()->getForeignKeyName(), 'fKey' => $client->autopays()->getLocalKeyName() ] ]; foreach ($joinFunc as $table => $jQ){ $relTbl = $jQ['related']; $k = $jQ['oKey']; $fk = $jQ['fKey']; $q->leftJoin($table, $table. '.' . $k, $relTbl. '.' .$fk); }
关键说明
getRelated()返回的是关联模型的实例,它的getForeignKey()方法仅返回该模型的默认外键,和关联关系的自定义设置无关。- 关联实例(比如
HasMany对象)的getForeignKeyName()/foreignKey对应你在hasMany中第二个参数设置的外键;getLocalKeyName()/localKey对应第三个参数设置的本地键。
内容的提问来源于stack exchange,提问作者mustafeez ali
相关产品推荐
相关产品推荐

