2017-01-10 2 views
0

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

class Contractor extends Model 
{ 
    protected $table = "contractors"; 

    public function user() 
    { 
     return $this->belongsTo("\App\Account", "user_id", "id"); 
    } 

} 

Имея в виду, что учетная запись имеет следующие поля

Счет

  • ID
  • PASSWD
  • имя

Я хотел бы получить подрядчиков с его полей и пользовательских полей объединяются так же, как если бы они где то же самое, как и что:

Подрядчик

  • ID
  • PASSWD
  • имя
  • contractor_type

Я не хочу:

\App\Contractor::with('user')->first(); 

Я хотел бы получить все поля с

\App\Contractor::first() 

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

+0

это невозможно, требуется для связи –

+0

Для достижения этой цели вам требуется инструкция [join] (https://laravel.com/docs/5.3/queries#joins). – devk

ответ

1

Чтобы достичь этого, вам понадобится заявление об объединении. Что-то в этом направлении (есть внутреннее, левое и правое соединение, я не уверен, какой из них вам подходит).

$contractor = \App\Contractor::join('users', 'contractors.user_id', '=', 'accounts.id') 
    ->select('accounts.id', 'contractors.user_id', 'accounts.id', 'accounts.passwd', 'accounts.name', 'contractors.contractor_type') 
    ->first(); 

Я предположил, что имена таблиц «учетные записи» и «подрядчики».

1

Я думаю, что ваш запрос как:

$rsltContractors = \App\Contractor::selectRaw('accounts.id', 'accounts.passwd', 'accounts.name','contractors.id','contractors.user_id','contractors.name','contractors.contractor_type') 
      ->join('accounts', 'accounts.id', '=', 'contractors.user_id')->first(); 

Надеется, что это работа для Вас!

Смежные вопросы