Получение данных об отношениях в Eloquent ORM (Laravel PHP)

Я создаю приложение Laravel и получаю данные из БД с помощью Eloquent ORM, отвечая ответом JSON. В этом примере я получаю совпадения с некоторыми другими соответствующими данными по отношению (player1, matchRule...).

public function test() {
    $match = Match::where("state", 2)
        ->with("player1", "player2", "points", "matchRule")->first();

    return response()->json($match); // CASE A
    return response()->json((object) ["id" => $match->id]); // CASE B
    return response()->json((object) ["rule" => $match->match_rule]); // CASE C
}

В случае A все в порядке, и все соответствующие данные возвращаются. Пример:

{
   "id": 7,
   "some_other_match_property": "something",
   ...
   "match_rule": {
      "rule_1": "something",
      "rule_2": "something",
   }

}

В случае B я получаю только идентификатор совпадения, и он также отлично работает.

{
   "id": 7
}

В случае C я пытаюсь получить свойство match_rule, но получаю null. Почему? Как видите, он присутствует в объекте $match при возврате всего совпадения в случае A.

{
    "rule": null
}

person P.N.    schedule 12.05.2019    source источник


Ответы (1)


На первый взгляд я вижу, что вы загружаете свои отношения matchRule следующим образом (camel case):

$match = Match::where("state", 2)
    ->with("player1", "player2", "points", "matchRule")->first();
                                            ^^^^^^^^^^

Но вместо этого вы обращаетесь к такому отношению (snake case):

return response()->json((object) ["rule" => $match->match_rule]);
                                                    ^^^^^^^^^^^

Это не эквивалентно. Попробуйте это вместо этого:

return response()->json((object) ["rule" => $match->matchRule]);
                                                    ^^^^^^^^^^
person Kenny Horna    schedule 12.05.2019
comment
О да, ты прав! Благодарю вас! Но, как вы можете видеть в случае A, имя свойства в объекте $matchmatch_rule, так почему я не могу получить к нему доступ с помощью ->match_rule? - person P.N.; 12.05.2019
comment
@П.Н. Я думаю, что в Laravel поведение по умолчанию заключается в том, чтобы получить змеиную версию отношения (имя функции) при получении в качестве атрибута. Проверьте эту тему, там упоминается, что это можно отключить, установив false свойство $snakeAttributes модели: public static $snakeAttributes = false;. Попробуйте и вернитесь, чтобы рассказать нам, сработало ли это. Хорошего дня. - person Kenny Horna; 12.05.2019