Дополнительно где в построителе запросов laravel - PullRequest
0 голосов
/ 04 декабря 2018

Я присоединился к таблице в своем запросе, но мне нужно проверить значение столбца в этой таблице, он возвращает

 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'on' in 'on clause'

Код

$interests = DB::table('projects')
->where('projects.published', 'y')
->whereDate('projects.created_at', Carbon::now()->subDay())
->join('project_tag', 'project_tag.project_id', '=', 'projects.id') //get project tags


->join('mailings', 'mailings.interests', '=', 'on') //get mailing lists with on value in interests column


->join('users', 'users.id', '=', 'mailings.user_id') //get mailing users
->join('user_interests', 'user_interests.user_id', '=', 'users.id') //get mailing users intrests (same as tags in projects)
->select('projects.*', 'users.*')
->get();

Моя проблема в этой строке

->join('mailings', 'mailings.interests', '=', 'on')

Я просто хочу присоединиться mailings, где их значение столбца intrests установлено на on

Есть идеи?

Обновить

Я изменил свою выданную строку на:

->join('mailings', function ($join) {
  $join->where('mailings.interests', '=', 'on');
})

, теперь она возвращает результаты, но выходные данные дублируются и не завершены.вот что я получаю dd

lluminate\Support\Collection {#819     
 #items: array:6 [                     
   0 => {#824                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "Diana Bosco"            
     +"email": "arunolfsson@example.net
   }                                   
   1 => {#827                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "Diana Bosco"            
     +"email": "arunolfsson@example.net
   }                                   
   2 => {#820                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "admin"                 
     +"email": "admin@admin.com"       
   }                                   
   3 => {#826                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "admin"                 
     +"email": "admin@admin.com"       
   }                                   
   4 => {#823                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "Aurelia Treutel I"      
     +"email": "korey13@example.net"   
   }                                   
   5 => {#825                          
     +"title": "test 1"                
     +"slug": "test-1"                 
     +"budget": 23454235.0             
     +"name": "Aurelia Treutel I"      
     +"email": "korey13@example.net"   
   }                                   
 ]

выпусков

  1. Данные дублируются для каждого пользователя
  2. Он получает один и тот же проект для всех пользователей, в то время как долженотличаться в зависимости от их тегов.

Для ясности Logic

  1. У моих пользователей есть теги (я назвал это интересами)
  2. Проекты также имеют теги
  3. Я хочу получить проекты, которые имеют те же теги, что и интересы пользователя, и показать их пользователю.
  4. Элемент списка

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Применить фильтр как,

$interests = DB::table('projects')
            ->where('projects.published', 'y')
            ->whereDate('projects.created_at', Carbon::now()->subDay())
            ->join('project_tag', 'project_tag.project_id', '=', 'projects.id') //get project tags

            // the filter
            ->where('mailings.interests', 'on')

            ->join('users', 'users.id', '=', 'mailings.user_id') //get mailing users
            ->join('user_interests', 'user_interests.user_id', '=', 'users.id') //get mailing users intrests (same as tags in projects)
            ->select('projects.*', 'users.*')
            ->get();
0 голосов
/ 04 декабря 2018

Используйте ->join(), чтобы присоединиться к таблице mailings с помощью ссылки FK, как вы это делали для других таблиц, затем измените предложение where на массив условий:

->where([
    ['projects.published', '=', 'y'],
    ['mailings.interests', '=', 'on'],
])
...