Laravel的“with”方法将变量名转换为蛇形大小写

16
在我的Laravel应用程序中,我有一个模型,它定义了如下关系:
public function vitalCategories()
{
    return $this->belongsToMany(
        'App\Models\Diagonals\VitalLabelCategory',
        'vitalLabelCategoryMap',
        'vitalLabelId',
        'vitalLabelCategoryId');
}
当我像下面这样查询记录时,我期望使用变量名 vitalCategories 可以访问关系。
$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
return json_encode($vitalLabel);
然而,上面的查询生成了一个名为“vital_categories”的变量,如下所示:

enter image description here

如何让 Laravel 停止将我的变量命名为蛇形命名法(snake case)?

只是为了好玩,我也尝试了:
$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
$vitalLabel->load('vitalCategories');
$vitalLabel->vitalCategories = $vitalLabel->vitalCategories() ;
return json_encode($vitalLabel);

未能看到相关模型:

在此输入图像描述

因此我尝试了:

$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
$vitalLabel->load('vitalCategories');
$vitalLabel->vitalCategories = $vitalLabel->vital_categories;
return json_encode($vitalLabel);

该模型也未能看到相关的模型:

在此输入图片描述

1个回答

28

Laravel会在将模型转换为数组(toArray())或 json (toJson())时,自动将关系名称从camelCase转换为snake_case

因此,在模型上的属性实际上是vitalCategories,但当您将其作为json输出时,它将打印为vital_categories

如果您想关闭此功能,可以将模型上的$snakeAttributes属性设置为false。

public static $snakeAttributes = false;

1
看起来实际上是 static $snakeAttributes = false;(静态 vs 受保护),但你做得很好,谢谢! - Wesley Smith
1
@DelightedD0D 是的,而且它还是public公开的。抱歉,我更多地是根据记忆而不是查看实际代码。我已经更新了答案。谢谢! - patricus
无瑕的答案 - Gjaa
另外,由于该属性是公共的,您可以在获取数组之前或任何地方设置它。关键是很容易忘记在load()方法而不是在toArray()方法中不需要此属性。 - toraman
1
这种荒唐的行为恰好会让我离开像Laravel这样的框架。拜托了,Laravel,你应该做得更好。 - WebDev-SysAdmin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接