多个 Eloquent 关系

Multiple Eloquent Relations

在我的应用程序中,我有几个模型,每个模型都有一些关系。 我的问题是我必须获取所有相关数据,所以我正在使用查询生成器,但我不知道从哪里开始。

如果有知道的帮帮我,这些是我的模型和关系。(下面我会说明我要数据的方式)。

制造:(产品)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Fabricacion extends Model
{
    protected $table = "fabricacion";
    protected $primaryKey = "id_fabricacion";
    protected $fillable = ["id_order", "id_megacart", "reference", "name", "width", "height", "length", "date_update", "id_categoria", "id_ubicacion", "id_incidencia", "estado"];
    public $timestamps = true;

    public function incidencia() {
        return $this->belongsTo("App\Models\Incidencia", "id_incidencia", "id_incidencia");
    }

    public function categoria() {
        return $this->belongsTo("App\Models\Categoria", "id_categoria", "id_categoria");
    }

    public function ubicacion() {
        return $this->belongsTo("App\Models\Ubicacion", "id_ubicacion", "id_ubicacion");
    }

    public function medidas() {
        return $this->belongsToMany("App\Models\Medida", "fabricacion_medidas", "id_fabricacion", "id_medida")->withPivot("medida");
    }

    public function atributos() {
        return $this->belongsToMany("App\Models\Atributo", "fabricacion_atributos", "id_fabricacion", "id_atributo")->withPivot("atributo");
    }
}

类别:(类别)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Categoria extends Model
{
    protected $table = "categorias";
    protected $primaryKey = "id_categoria";
    protected $fillable = ["id_prestashop", "nom_categoria"];
    public $timestamps = false;

    public function fabricaciones() {
        return $this->hasMany("App\Models\Fabricacion", "id_categoria", "id_categoria");
    }

    public function tareas() {
        return $this->belongsToMany("App\Models\Tarea", "categorias_tareas", "id_categoria", "id_tarea")->withPivot("orden");
    }
}

Ubicacion:(ubication)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Ubicacion extends Model
{
    protected $table = "ubicaciones";
    protected $primaryKey = "id_ubicacion";
    protected $fillable = ["nom_ubicacion"];
    public $timestamps = false;

    public function fabricaciones() {
        return $this->hasMany("App\Models\Fabricacion", "id_incidencia", "id_incidencia");
    }
}

Medida:(测量值)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Medida extends Model
{
    protected $table = "medidas";
    protected $primaryKey = "id_medida";
    protected $fillable = ["nom_medida"];
    public $timestamps = false;

    public function fabricaciones() {
        return $this->belongsToMany("App\Models\Fabricacion", "fabricacion_medidas", "id_medida", "id_fabricacion")->withPivot("medida");
    }

}

属性:(属性)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Atributo extends Model
{
    protected $table = "atributos";
    protected $primaryKey = "id_atributo";
    protected $fillable = ["id_prestashop", "nom_medida"];
    public $timestamps = false;

    public function fabricaciones() {
        return $this->belongsToMany("App\Models\Fabricaion", "fabricacion_atributos", "id_atributo", "id_fabricacion")->withPivot("atributo");
    }
}

-- 类别关系:(类别)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Tarea extends Model
{
    protected $table = "tareas";
    protected $primaryKey = "id_tarea";
    protected $fillable = ["nom_tarea", "posicion"];
    public $timestamps = false;

    public function categorias() {
        return $this->belongsToMany("App\Model\Categoria", "categorias_tareas", "id_tarea", "id_categoria")->withPivot("orden");
    }

    public function zonas() {
        return $this->hasMany("App\Models\Zona", "id_tarea", "id_tarea");
    }
}

--任务关系:(任务)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Zona extends Model
{
    protected $table = "zonas";
    protected $primaryKey = "id_zona";
    protected $fillable = ["nom_zona", "posicion", "id_tarea", "impresora", "minSierra"];
    public $timestamps = false;

    public function tarea() {
        return $this->belongsTo("App\Models\Tarea", "id_tarea", "id_tarea");
    }
}

问题是我想通过 categoria(category)、ubicacion(ubication)、zona(workspace) 和 tarea(task) 过滤所有的 fabricacion(product) 数据,得到它的 atributos(attributes) 和 medidas (测量).

例如:我想从 zona(workspace) => X 中获取所有 fabricacion(product) 数据,其中 categoria(category) => Y 和 ubicacion(ubication) => A。 产品有一个类别,类别与任务相关(因此,具有 X 类别的产品将在工作区 Y 中)。 并且产品有一个状态(因此,如果在状态 1 中并且在类别 1 中是一项任务,则产品将在该任务中)。

这可能解释得不好。有时候自己也不解释,英语也不太懂

在这种情况下,我将创建一个控制器方法来接收来自视图的所有过滤器(zona、categoria 和 ubicacion),这些过滤器通过 ajax 发送。之后,您可以在查询中使用参数,并使用通用函数应用过滤器和 returns 您在视图中指定的内容。

所以,步骤是:

  1. 创建调用控制器函数的路由

  2. 向该路由发送一个 ajax 请求,其中包含您要在邮件数据中应用的过滤器。

  3. 在控制器函数中接收过滤器的信息并创建查询。

路线

将路由添加到您的 web.php 或 routes.php 文件。

Route::get('fabricaciones/data', 'HomeController@data'); // whatever controller name

控制器

进行查询的控制器方法的示例如下所示:

function data(Request $request)
{
    $categoria_id = $request->input('categoria_id');

    // ...

    $result = DB::table('fabricacion')
        ->join('categorias', 'categorias.id', '=', 'fabricacion.categoria_id')
        ->join(...) // more joins with the other tables
        ->where('categorias.id', '=', $categoria_id)
        ->where(...) // apply more filters
        ->select('fabricacion.*')
        ->get();

    return $result;
}

Ajax 视图中的请求

JavaScript 中的 ajax 请求(使用 jQuery)在您的视图中将是这样的,但指向您创建的路线:

$.ajax({
    url: 'fabricaciones/data',
    type: 'GET',
    dataType: 'json',
    data: { categoria_id: 1 },
})
.done(function(received_data) {
    console.log(received_data);
})
.fail(function() {
    console.log("error");
});

嗯,终于搞定了,谢谢大家的回复^^

$productos = Fabricacion::where(
            $where
        )
        ->whereHas("categoria", function($query) use($id_zona) {
            $query->whereHas("tareas", function($query) use($id_zona) {
                $query->whereHas("zonas", function($query) use($id_zona) {
                    $query->where([
                        ["zonas.id_zona", "=", $id_zona]
                    ]);
                    $query->whereRaw("categorias_tareas.orden = `fabricacion`.`estado`");
                });
            });
        })
        ->with(["medidas", "atributos"])
        ->orderBy("fabricacion.date_update", $date);