Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.01.2016 18:19:35

Eloquent ORM LEFT JOIN

Коллеги расскажите как приготовить нормальный LEFT JOIN вместо тысячи SELECT.
И есть ли стандартное решение

Имеется модель

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Call extends Model
{
protected $table = "calls";

public function call_status() {
return $this->hasOne('App\CallStatus', 'callStatusId', 'CallType')->select('callStatusName', 'callStatusColor');
}
public function user_name() {
return $this->hasOne('App\User', 'id', 'CallUser')->select('name');

}
public function contact_name() {
return $this->hasOne('App\Contact', 'IDcontact', 'CallContact')->select('IDContact','FamilyContact','NameContact','SoNameContact');

}
public function client_name() {
return $this->hasOne('App\Client', 'ClientId', 'CallContragent')->select('ClientName','ClientId')->limit(1);

}

//
}

при вызове из контроллера Call::where('CallDate', '=',$today)->orderBy('CallDate',0)->orderBy('CallTime',0)->get()
Выбирает все что надо, но не одним JOINом а кучей селектов. Получается что для каждой строки из таблицы calls он делает по селекту - это не есть гуд

https://vk.com/laravel_rus?w=wall-53758340_16677%2Fall
PS::
Можно через DB::table и тут явно указывать связи, но это не Тру. смысл в модели отпадает

Не в сети

#2 26.01.2016 18:30:32

Re: Eloquent ORM LEFT JOIN

Конечно если в контроллере написать return view('calls', ['c_status' => CallStatus::all(),
            'today' => DB::table('calls')
                ->join('contacts', 'contacts.IDContact', '=', 'calls.CallContact')
                ->join('clients', 'clients.ClientId', '=', 'calls.CallContragent')
                ->orderBy('CallDate', 0)->orderBy('CallTime', 0)->get(),
            'lastday' => DB::table('calls')
                ->join('contacts', 'contacts.IDContact', '=', 'calls.CallContact')
                ->join('clients', 'clients.ClientId', '=', 'calls.CallContragent')
                ->orderBy('CallDate', 0)->orderBy('CallTime', 0)->get(),
            'call' => DB::table('calls')
                ->join('contacts', 'contacts.IDContact', '=', 'calls.CallContact')
                ->join('clients', 'clients.ClientId', '=', 'calls.CallContragent')
                ->orderBy('CallTime', 0)->get()]);
    }
то профит в 3 раза но не тру

Не в сети

Подвал раздела