2017-12-29 37 views
1

값 배열이 들어있는 JSON 필드를 쿼리하려고합니다. 예를 들어 표의 이름은 "사용자"이고 필드는 "친구"입니다. ID가 3 같음이있는 곳JSON 배열을 포함하는 JSON 필드에서 Laravel 5.4 쿼리 만들기

[{ 
    "id": 1, 
    "img": "img-1.jpg", 
    "name": "Name 1" 
}, 
{ 
    "id": 2, 
    "img": "img-2.jpg", 
    "name": "Name 2" 
}, 
{ 
    "id": 3, 
    "img": "img-3", 
    "name": "Name 3" 
}] 

그래서 내가하고 싶은 것이 친구 필드에서 사용자 테이블 쿼리 모두에 입니다 : 여기처럼 친구 필드가 보이는 방법입니다.

그래서 뭔가 같은 :

{ 
    "id": 1, 
    "img": "img-1.jpg", 
    "name": "Name 1" 
} 

절망, 그리고 나는 그것이 매우 아니다 알면서도 :의 exemple 위 그냥했다 그래서 만약 필드, 배열을 포함하지 않은 경우 완벽하게 작동 물론 User::where('friends->id', 3)->orderBy('id', 'desc')->get(); 논리적으로, 나는 "whereIn"을 시도했다 : User::whereIn('friends->id', [3])->get(). 또는 : User::where('friends->[0]->id', 3)->get(), User::where('friends->[*]->id', 3)->get(), User::where('friends->*->id', 3)->get().

또한 JSON_CONTAINS 또는 JSON_SEARCH으로 시도 : User::whereRaw('JSON_CONTAINS(friends->"$.id", "3")')->get() 및 다양한 변종하지만 아무것도를하지 않습니다.

여기에 오기 전에이 문제에 대한 몇 가지 흥미로운 기사 (아래 목록에 나와 있습니다)를 읽었지만 MySQL 데이터베이스에 JSON 배열을 저장 한 유일한 사람인 것처럼 보입니다. 어떻게 가능합니까? 그래서 만약 누군가가 나에게 내가 정말 감사하겠습니다이 문제를 해결하는 데 도움이 될 수 ^^

http://www.qcode.in/use-mysql-json-field-in-laravel/. 사이드 노트 : 현재 MySQL 버전은 5.7.11이므로 JSON 필드를 지원하고 Laravel이 오류를 발생시키지 않고 그냥 빈 배열을 반환합니다.

답변

1

whereRaw 시도가 매우 근접해 있습니다. 단일 개체를 저장하는 경우 경로는 $.id입니다. 그러나 객체 배열을 저장하고 있으므로 경로는 $[*].id입니다. 이것은 당신을 위해 작동합니다 :

User::whereRaw('JSON_CONTAINS(friends->"$[*].id", "3")')->get(); 

(JSON_EXTRACT() 단지 바로 가기 됨) friends->"$[*].id" 선택은 ID의 JSON 배열을 반환합니다. JSON_CONTAINS() 그러면 json 배열에 지정된 ID가 포함되어 있는지 확인합니다.

또 다른 옵션은 JSON_CONTAINS()에 사용할 json 검색 문자열을 작성하는 것입니다. 예를 들어,이 쿼리는 또한 작동합니다 : 당신은 단지 하나 개의 JSON 메소드를 호출하고, 그래서

User::whereRaw('JSON_CONTAINS(friends, \'{"id": 3}\')')->get(); 

이, JSON_EXTRACT()에 첫 번째 통화를 방지 할 수 있습니다. 나는 어떤 버전이 실제로 더 빠를 지, 어떤 차이가 있는지 모른다.

또한 JSON_SEARCH()과 관련된 쪽지에서이 함수는 문자열 값을 검색하는 경우에만 작동합니다.json이 ID가 문자열 대신 정수로 표시된다는 것을 보여주기 때문에 JSON_SEARCH()은 작동하지 않습니다. MySQL은 이것이 의도 된 동작이라고 주장한다 (bug 79233dup bug 79316).

참고로 단지 here is the documentation for the json search methods입니다.

+0

당신은 선생님, 방금 내 하루를 보냈습니다! 고맙습니다. ** 두 가지 솔루션이 모두 작동합니다 **, 좀더 우아하고 더 많은 JSON과 비슷한 것을 찾고 나만 json 메서드 만 호출하면 후자를 사용하게 될 것입니다. 매우 정직하지만 완전한 대답에 다시 한 번 감사드립니다. –