Laravel 加载关系 - 框架错误?

我遇到了一些奇怪的事情,我认为这可能是框架本身的错误,所以我想知道是否有类似的经历。


我有两个实体:Contact和Media处于 1:M 关系。关系定义为:


public function media()

{

    return $this->hasMany(Media::class);

}

现在我看到的问题是,当我继续show控制器方法并加载关系时,如下所示:


public function show(Contact $contact)

{

    $contact->load('media');

    return response()->json($contact);

}

联系方式已解决,媒体关系如下:


"first_name": "Melisa",

...

"media": [

    {

        "id": 50,

    ...

但是,如果我修改关系的大小写,以便我调用:


public function show(Contact $contact)

{

    $contact->load('mEdIa');

    return response()->json($contact);

}

它返回:


"first_name": "Melisa",

...

"m_ed_ia": [

    {

        "id": 50,

    ...

……这确实令人不安。它应该发生吗?


眼眸繁星
浏览 74回答 2
2回答

湖上湖

这种行为应该在 Laravel 的文档中注明,事实并非如此。如果我是你,我会提出一个关于更新有关此行为的文档的问题,并看看会有什么反应。但事实上,这是一个功能,而不是一个错误。PHP 的本质在很多方面都是敏感和不敏感的。对于类和方法;PHP 是不敏感的。class Contact {    public function media() {        return .. relationship;    }}// validnew CONTACT();(new contact())->mediA();// valid reflection$r = \ReflectionClass('contact');$r->hasMethod('mediA'); // true所以这些奇怪的东西都是有效的。现在到你说的这一点:..从我的角度来看mEdia不应该被允许。我的关系函数名称是media,我希望它被这样使用。那么你必须这样写。你必须这样做,因为 Laravel 依赖于它。PHP 根本无法验证/验证。Laravel 必须改变编程语言的本质,其敏感性是通过选择故意设计的。这里的期望是;您(作为程序员)应该了解 PHP 的敏感性,因此在这种情况下,绝对不需要验证给定的输入。验证/验证这样的事情的开销将是巨大的并且没有意义。$class = 'contact';$method = 'mediA';$r = new \ReflectionClass($class);if($class !== $r->getName()) {    throw new \Exception('unknown class');}if(!in_array($method, array_map(function($method) {    return $method->name;}, $methods))) {    throw new \Exception('unknown method');}// valid from here从各个角度来看, 的用法$contacts->with('mediA')是完全有效的。mediA转换为数组(本身)时使用medi_a的事实Str::snake('mediA')只是您必须处理的 Laravel 的一个功能。

慕森王

Laravel 中有这样的行为。要获得相同的密钥“mEdIa” - 您必须添加到media模型。public static $snakeAttributes = false;
打开App,查看更多内容
随时随地看视频慕课网APP