问题
In my Laravel app, I have A model that defines a relationship like:
public function vitalCategories()
{
return $this->belongsToMany(
'App\Models\Diagonals\VitalLabelCategory',
'vitalLabelCategoryMap',
'vitalLabelId',
'vitalLabelCategoryId');
}
When I query a record like below, I expect the relation to be available with the variable name vitalCategories
$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
return json_encode($vitalLabel);
However, the above query produces the relation with the variable name 'vital_categories' like this:
How can I make laravel stop changing the case of my variable for the relation to snake case?
Just for grins, I also tried:
$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
$vitalLabel->load('vitalCategories');
$vitalLabel->vitalCategories = $vitalLabel->vitalCategories() ;
return json_encode($vitalLabel);
which failed to see the related models:
so then I tried:
$vitalLabel = VitalLabel::where('label', 'confirmation')->with(['subscribers','vitalCategories','vitals'])->first();
$vitalLabel->load('vitalCategories');
$vitalLabel->vitalCategories = $vitalLabel->vital_categories;
return json_encode($vitalLabel);
which also failed to see the related models:
回答1:
Laravel automatically converts the names of relationships from camelCase
to snake_case
when the model is converted to an array (toArray()
) or json (toJson()
).
So, the attribute on the model is actually vitalCategories
, but when you dump it out as json, it will print as vital_categories
.
If you would like to turn this off, you can set the $snakeAttributes
property on your model to false.
public static $snakeAttributes = false;
来源:https://stackoverflow.com/questions/44793812/laravel-with-changes-variable-case-to-snake-case