[英]Laravel eloquent with multiple inner joins
我目前正在執行原始 sql 查詢,但這會導致關系和 model 引導方法出現問題。
是否可以通過關系執行以下 SQL 查詢但使用 laravel eloquent 模型? 請注意,所有 db 表都定義了 FK,以及 HasOne 或 HasMany 關系。
$timeBreakDown = DB::select(
"SELECT
Entries.`task_id`,
Entries.`opportunity_id`,
SUM(Entries.`total_duration`) as 'duration',
Class.`class` as 'class',
Subclass.`sub_class` as 'subclass'
from entries Entries
INNER JOIN `tasks` Task
ON task_id = Task.id
INNER JOIN `task_class` Class
ON Task.`class_id` = Class.`id`
INNER JOIN `task_subclasses` Subclass
ON Task.`subclass_id` = Subclass.`id`
WHERE Entries.`opportunity_id` = '".$opportunity->id."'
GROUP BY Entries.`task_id`"
);
型號是
Entries
Tasks
Class
Subclass
我將如何構建我的模型關系來處理上述 sql 查詢?
如果您發布了您的模型,那會更容易。 但這是我從你上面的原始查詢中得到的。
timeBreakDown= Entries::where('opportunity_id',$opportunity->id)->load('Tasks','Class.SubClass')->get();
您應該閱讀有關 Laravel eloquent 和關系的信息。 只是為了簡要介紹,Waleed 使用的 load 和 with 之間的區別是:Load 用於延遲加載關系數據,而 with 用於急切加載。
急切加載是在 Eloquent 查詢數據時立即加載所有數據,而延遲加載在需要時加載數據。
是的,你可以用 Eloquent 來做我會和你分享一個例子我無法閱讀你的混亂查詢對不起,但我會建議你這樣做
Entries::with(['Tasks','Class','Subclass'])->get();
從此,您將獲得該數組中的所有對象
讓我們說
class 與另一個 Model 有關系但不是 Entries 表然后 Eloquent 是這樣的
Entries::with(['Tasks','Class.Subclass'])->get();
希望它對你有幫助
可能是這樣的:
$timeBreakDown = Entries::select('entries.task_id, entries.opportunity_id', DB:raw('SUM(Entries.total_duration) as duration), task_class.class, task_subclasses.sub_class as subclass)
join('tasks', [['tasks.id', 'entries.task_id']])
join('task_class', [['task_class.id', 'entries.class_id']])
join('task_subclasses', [['task_subclasses.id', 'entries.subclass_id']])
->where('entries.opportunity_id', $opportunity->id)
->groupBy('entries.task_id')
->get();
試試這個查詢:
$timeBreakDown = Entries::join('tasks', 'tasks.id', '=', 'entries.task_id')
->join('class', 'class.id', '=', 'entries.class_id')
->join('subclass', 'subclass.id', '=', 'entries.subclass_id')
->select(
'entries.task_id',
'entries.opportunity_id',
\DB::raw('SUM(entries.total_duration) as duration'),
'class.class',
'subclass.sub_class as subclass')
->where('entries.opportunity_id', $opportunity->id)
->groupBy('entries.task_id')
->get();
並嘗試dd($timeBreakDown->toSql());
與您的原始 SQL 查詢相匹配。
來自官方文檔。 您可以通過將 tasks 方法添加到Entries
model 來使用基本數據庫關系類型定義關系。 tasks 方法應該調用hasOne
方法並返回其結果。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Entries extends Model
{
/**
* Get the phone associated with the user.
*/
public function task()
{
return $this->hasOne(Tasks::class);
}
}
反過來, Tasks
model 將有一個入口方法,我們可以使用belongsTo
方法確定hasOne
關系的逆:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tasks extends Model
{
/**
* Get the user that owns the phone.
*/
public function entry()
{
return $this->belongsTo(Entries::class);
}
}
你只需要設置這樣的關系:
我假設Class
將有一個Class
subClass
將有Tasks
並且這些Tasks
有Entries
。
你也沒有User
model 嗎?
Class Model
class Class extends Model
{
protected $with = ['entries', 'subclass', 'task'];
public function entries()
{
return $this->hasManyThrough(\App\Models\Entries::class, \App\Models\Task::class);
}
public function subClass()
{
return $this->hasOne(\App\Models\subClass::class);
}
public function tasks()
{
return $this->hasMany(\App\Models\Task::class);
}
}
條目 Model
class Entry extends Model
{
protected $with = ['task'];
public function task()
{
return $this->belongsTo(Task::class);
}
}
子類 Model
class SubClass extends Model
{
protected $with = ['class'];
public function class()
{
return $this->belongsTo(\App\Models\Class::class);
}
}
任務 Model
class Task extends Model
{
protected $with = ['entries', 'class'];
public function entries()
{
return $this->hasMany(\App\Models\Class::class);
}
public function class()
{
return $this->hasMany(\App\Models\Task::class);
}
}
完成所有這些設置后,您應該可以在堆棧中的任何位置執行以下操作:
$entry = Entry::findOrFail('id');
$entry->task->class->subClass->name;
或者
$class = Class::findOrFail($class->id);
$subclass_name = $class->subclass->name;
$entries = $class->tasks->entries;
希望這可以幫助...
你可以這樣寫一個查詢:
請根據您的數據庫檢查表名
DB:: table('table name')->join('tasks','task_id','=','tasks.id')
->join('task_class', 'tasks.subclass_id','=','task_class.id')
->join('task_subclasses','tasks.subclass_id','=', 'task_subclasses.id')
->selectRaw('entries.task_id,
task_subclasses.opportunity_id,
SUM(entries.total_duration) as duration,
task_class.class as class,
task_subclasses.sub_class as subclass')
->where(['entries.opportunity_id'=>$opportunity->id])
->groupBy('enteries.task_id')->get();
型號\條目.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Entries extends Model
{
public function Tasks(){
return $this->hasOne(Tasks::class);
}
public function Class(){
return $this->hasMany(Classes::class);
}
public function SubClasses(){
return $this->hasOne(SubClasses::class);
}
}
模型\任務.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tasks extends Model
{
public function Entries(){
return $this->belongsTo(Entries::class, "id", "task_id");
}
}
型號\類.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Classes extends Model
{
public function Entries(){
return $this->belongsTo(Entries::class, "class_id", "id");
}
}
型號\子類.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class SubClasses extends Model
{
public function Entries(){
return $this->belongsTo(Entries::class, "id", "subclass_id");
}
}
詢問:
Entries::with([
"Tasks",
"Classes",
"SubClasses"
])
->where("opportunity_id", $opportunity->id)
->groupBy("task_id")
->get();
我希望這對你有用。 如果是這樣,將不勝感激
$data = DB::table('Entries')
->select('Entries.task_id', 'Entries.opportunity_id', DB::raw('SUM(Entries.total_duration) as duration'), 'Class.class as class', 'Subclass.sub_class as subclass')
->join('Tasks', 'Tasks.task_id', '=', 'Entries.task_id')
->join('Class', 'Tasks.class_id', '=', 'Class.id')
->join('Subclass', 'Tasks.subclass_id', '=', 'Subclass.id')
->where('Entries.opportunity_id', '=', $opportunity->id)
->groupBy('Entries.task_id')
->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.