Laravel извлечь раздел на json объекте - PullRequest
1 голос
/ 27 мая 2020

Мне трудно найти способ запросить объект json в моей БД. Постараюсь объяснить, что мне нужно. У меня есть объект, который будет меняться в основном каждый день, поэтому я решил сохранить его как json

"crew": [
            {
                "Crew": "CA001",
                "count": "1",
                "Craft": "CA",
                "craftType": "Carpenters",
                "members": [
                    {
                        "Badge": "10484658",
                        "Name": "Cudmore Gregory",
                        "Class": "Carpenter GF",
                        "shift": "1"
                    },
                    {
                        "Badge": "10484913",
                        "Name": "Harris Thomas",
                        "Class": "Carpenter JM",
                        "shift": "1"
                    },
                    {
                        "Badge": "10484658",
                        "Name": "Cudmore Gary",
                        "Class": "Carpenter GF",
                        "shift": "2"
                    },
                    {
                        "Badge": "10484913",
                        "Name": "Harris Joe",
                        "Class": "Carpenter JM",
                        "shift": "2"
                    }
                ]
            }...

        ]

Что мне нужно сделать, так это запросить пример, где Crew = 'CA001' или члены, где shift = 2 и возвращает только массив с соответствующими значениями.

Пока что я нашел это для запроса, но он возвращает весь объект!

        $crew = CtcCrew::where('userID', $user->userID)->where('companyID', $user->companyID)
        //->whereJsonContains('dataCrew', ['crew' => ['Crew' => 'CA001']])->first();
        ->whereJsonContains('dataCrew', ['crew' => ['members' => ['Badge' => '10484658']]])->first();

Спасибо!

1 Ответ

0 голосов
/ 27 мая 2020

Вот как бы я это сделал. Пожалуйста, протестируйте данный код и оставьте меня в комментариях ниже.

// fetch crew data
$crews = CtcCrew::where('userID', $user->userID)
    ->where('companyID', $user->companyID)
    ->first();


// convert the crew information from json to an array
$crewData = json_decode($crews->dataCrew, true);


$return = collect($crewData)->map(function ($crew) {
    $memberFound = false;
    $memberFound = collect($crew['members'])->map(function ($member) {
        if ($member['shift'] == 2) {
            return true;
        }
    });

    if ($crew['Crew'] == 'CA001' || $memberFound) {
        return $crew;
    }
})->filter();  // filter to remove null values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...