簡體   English   中英

Laravel eloquent 帶多個內連接

[英]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並且這些TasksEntries

你也沒有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM