3

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

我有两个实体: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,
    ...

……这真是令人不安。它应该发生吗?

4

2 回答 2

3

这种行为应该在 Laravel 的文档中注明,事实并非如此。如果我是你,我会打开一个关于更新有关此行为的文档的问题,并查看响应是什么。

但说起来,这是一个特性,而不是一个错误

PHP 的本质在很多方面都是敏感的和不敏感的。对于类和方法;PHP 是不敏感的。

class Contact {
    public function media() {
        return .. relationship;
    }
}

// valid
new 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

从各个角度来看,使用 of$contacts->with('mediA')是完全有效的。

转换为数组时使用的事实(这样)只是您必须处理的 Laravel 的mediA一个medi_a功能。Str::snake('mediA')

于 2020-07-17T11:32:57.157 回答
0

Laravel 中有这样的行为。要获得相同的密钥 'mEdIa' - 您必须添加到media模型中。

public static $snakeAttributes = false;

于 2020-07-16T15:31:44.620 回答