Mysql объединить три таблицы / Laravel запрос - PullRequest
1 голос
/ 17 октября 2019

У меня есть три таблицы «Получатель», «Вопросы», «Ответы» .. «Получатель»

Benficiary
id name
1  user1
2 user2
3 user3

Questions
id question             type
1  what is your hobby   hobby
2  address              contact
3  phone                contact
..questions upto 500 and i need to select according to its type

Response
id beneficiary_id question_id response
1  1              1           football
2  1              3           5354353
3  2              1           basketball
4  3              2           cityname
5  3              3           432423

Таблица «Получатель» и «Вопрос» являются статическими, но таблица ответов объединяет обе. Я пытался сделать это из запроса laravel, но он дает мне только ответы sql query

select response,questions.question, beneficiarys.name 
from responses RIGHT join (questions,beneficiarys) 
on beneficiarys.id = responses.beneficiary_id && questions.id = responses.question_id 
where questions.sheet_type = 'SCDS' OR questions.sheet_type = 'SMM'

запрос laravel

$beneficiaries =       Beneficiary::with('quests','response')->whereHas('response', function ($query)use($sheet_type) {
             $query->where('beneficiary_id', '>', 0);
        })
->whereHas('quests',function($query)use($sheet_type){
                $query->where('questions.sheet_type','=',$sheet_type);
                $query->orWhere('questions.sheet_type','=','SCDS');
            })
        ->where('updated_at','>=',!empty($this->request->from_date)?$this->request->from_date:$from)->where('updated_at','<=',!empty($this->request->to_date)?$this->request->to_date:$date)->get();

Модель получателя

public function response()
{
return $this->hasMany('App\Model\Response');
}

public function quests(){
return $this->belongsToMany('App\Model\Question',   'responses','beneficiary_id','question_id');

}

Модель вопроса

public function response(){
    return $this->hasMany('App\Model\Response');
}

public function bens(){
    return $this->belongsToMany('App\Model\Bebeficiary', 'responses','question_id','beneficiary_id');
}

Модель ответа

public function beneficiary(){
    return $this->belongsTo('App\Model\Beneficiary', 'beneficiary_id');
}

public function question(){
    return $this->belongsTo('App\Model\Question', 'question_id');
}

Мне нужен весь вопрос в соответствии с его типом (тип выбирается пользователем из представления), и мне нужен вывод, подобный этому

beneficary  hobby     address phono  ....
user1       football  null    4244   ....
user2       basketball null   null   ....

есть ли способ добиться этого с помощью sql или laravel запроса *

Ответы [ 4 ]

0 голосов
/ 18 октября 2019

Если вы хотите сделать это красноречивым способом, вы можете попробовать использовать whereHas в ваших вложенных отношениях. Попробуйте что-то вроде:

Beneficiary::with('response.question')->whereHas('response.question')

Для получения дополнительной ссылки попробуйте эту ссылку Красноречивый с вложенными отношениями

0 голосов
/ 18 октября 2019

Попробуйте

 $res = DB::table('responses')
   ->join('questions','responses.question_id','=','questions.id')
   ->join('beneficiarys','responses.beneficiary_id','=','beneficiarys.id')
   ->select('responses.*','questions.question','beneficiarys.name')
   ->where('questions.sheet_type', '=','SCDS')
   ->orWhere('questions.sheet_type','=','SMM')
   ->get();

Используйте результат как

 foreach($res as $res)
 {
   echo $res->name;
 }
0 голосов
/ 18 октября 2019

Вы получите результат по этому запросу. Настройка поддержки Laravel.

$sSQL = "SELECT * FROM RESPONSE 
INNER JOIN QUESTION ON QUESTION.id=RESPONSE.QUESTION_id
INNER JOIN  BENEFICIARY ON BENEFICIARY.id=RESPONSE.BENEFICIARY_id";
DB::query($sSQL);
0 голосов
/ 17 октября 2019

это MySQL Select, может быть, лучший способ, но эта работа

SELECT b.name,hobby.response as hobby,address.response as addres,phone.response as 
phone FROM beneficiary as b
left join (select *  from response where question_id=1 ) as hobby
      on hobby.beneficiary_id = b.id
left join (select *  from response where question_id=2 ) as address
      on address.beneficiary_id = b.id
left join (select *  from response where question_id=3 ) as phone
      on phone.beneficiary_id = b.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...