Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Коллеги расскажите как приготовить нормальный 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 и тут явно указывать связи, но это не Тру. смысл в модели отпадает
Не в сети
Конечно если в контроллере написать 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 раза но не тру
Не в сети
Страницы 1