2017-06-21 21 views
5

Tôi đã làm việc với tài hùng biện của Laravel 5.4 và tôi đã gặp phải sự cố.Tìm kiếm trong cột JSON bằng cách sử dụng eloquent của Laravel

Tôi có bảng cơ sở dữ liệu được gọi là bài đăng và trong đó, cột có tên là template_ids. Nó lưu trữ các giá trị trong định dạng json_encoded như:

["1","25","48"] 

Bây giờ, tôi muốn áp dụng một bộ lọc để truy vấn của tôi dựa trên một loạt các ID:

$id_access = array:3 [ 
    0 => "1" 
    1 => "3" 
    2 => "48" 
] 

Những gì tôi đang cố gắng làm là để tìm kiếm nếu có bất kỳ giá trị $id_access nào có trong cột cơ sở dữ liệu, template_ids.

tôi đã cố gắng:

Post::where('accessable_to',1)->whereIn('template_ids', $template_access_array)->paginate(3); 

Ngoài ra, tôi đã cố gắng:

Post::where('accessable_to',1)->whereRaw("JSON_CONTAINS(template_ids, ".$template_access.")")->paginate(3); 

Đã xem this, nhưng nó không làm việc cho tôi.

+0

Có thể này https://stackoverflow.com/questions/41942374/json-search-in-laravel-eloquent sẽ giúp bạn. Ngoài ra, bạn cần phải thay đổi kiểu dữ liệu của template_id cột của bạn thành JSON trong mysql –

+0

bất kỳ lỗi nào bạn đang gặp phải? –

+0

@AlankarThêm tôi đã thêm liên kết. Tôi đã xem bài đăng này –

Trả lời

4

Để xem nếu trường template_ids JSON chứa "bất kỳ" của các giá trị trong một mảng kim, bạn sẽ cần phải sử dụng nhiều OR 'd JSON_CONTAINS điều kiện đòi hỏi MySQL 5.7:

$ids = ['1', '3', '48']; 

Post::where('accessable_to', 1) 
    ->where(function ($query) use ($ids) { 
     $firstId = array_shift($ids); 

     $query->whereRaw(
      'JSON_CONTAINS(template_ids, \'["' . $firstId . '"]\')' 
     ); 

     foreach ($ids as $id) { 
      $query->orWhereRaw(
       'JSON_CONTAINS(template_ids, \'["' . $id . '"]\')' 
      ); 
     } 

     return $query; 
    }); 

return Post::paginate(3); 

truy vấn Laravel của người xây dựng sẽ tạo một truy vấn như:

SELECT * FROM "posts" 
WHERE "accessable_to" = ? AND (
    JSON_CONTAINS(template_ids, '["1"]') OR 
    JSON_CONTAINS(template_ids, '["3"]') OR 
    JSON_CONTAINS(template_ids, '["48"]') 
) 

Bản ghi mục tiêu có bất kỳ ID nào trong số template_ids Trường được nhập JSON.

Bạn có thể quan tâm đến việc đọc một Laravel liên quan internals proposal.

0

gì sắp nói:

$query = Post::where([]); 

$query->where(function($query, $template_ids){ 
    foreach ($template_ids as $id){ 
    $query->orWhere('searching_field', 'like', '%'.$id.'%'); 
    } 
}); 

$query->get() 
Các vấn đề liên quan