Извлечение данных с помощью дополнительного поля флага на основе табличного отношения в Laravel (ORM) - PullRequest
0 голосов
/ 07 мая 2018

Скажем, у меня есть мастер-таблица с именем категория , например: -

|-----------------|
|  id  |   name   |
|-----------------|
|   1  |   Egg    |
|-----------------|
|   2  |   Meat   |
|-----------------|
|   3  |   Fish   |
|-----------------|

И user_category таблица, подобная этой: -

|--------------------------------------|
|   id  |    user_id  |    category_id |
|--------------------------------------|
|   1   |       1     |         1      |
|--------------------------------------|
|   2   |       1     |         3      |
|--------------------------------------|

Когда я выбираю на основе user_id, я хочу показать данные таким образом: -

|----------------------------------|
|  id  |   name   |   is_checked   |
|-----------------|----------------|
|   1  |   Egg    |       1        |
|-----------------|----------------|
|   2  |   Meat   |       0        |
|-----------------|----------------|
|   3  |   Fish   |       1        |
|-----------------|----------------|

Это потому, что я хочу создать панель, на которой пользователь будет видеть все категории в списке с галочкой, кроме определенных категорий, которые он сохранил.

Я пытался сделать это так: -

$categoryData = array();
$categoryList = Category::get();
foreach($categoryList as $cl)
{
   $category['id'] = $cl['id'];    
   $category['name'] = $cl['cname'];
   $isSaved = UserCategory::select('id')->where(
                                          array('user_id'=>$user_id, 'category_id' => $cl['id'])->count();
   if($isSaved > 0)
   {
     $category['saved'] = 1;
   } 
   else
   {
     $category['saved'] = 0;
   } 
   $categoryData[] = $category;
}

Есть ли другой способ, например, сделать все это, выполнив один запрос MySQL вместо цикла?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете увидеть следующий код для решения проблемы

$categoryData = Category::leftJoin('user_category', function($join) use ($user_id) {
                    $join->on('category.id', '=', 'user_category.category_id')
                         ->where('user_category.user_id','=',$user_id);
                 })
               ->select('category.id','category.name',
                                 DB::raw('
                                   (CASE 
                                     WHEN user_category.id is null THEN 0 
                                     ELSE 1 
                                    END) as saved'
                                 )
                      )
              ->get()
              ->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...