多个 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 您在视图中指定的内容。
所以,步骤是:
创建调用控制器函数的路由
向该路由发送一个 ajax 请求,其中包含您要在邮件数据中应用的过滤器。
在控制器函数中接收过滤器的信息并创建查询。
路线
将路由添加到您的 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);
在我的应用程序中,我有几个模型,每个模型都有一些关系。 我的问题是我必须获取所有相关数据,所以我正在使用查询生成器,但我不知道从哪里开始。
如果有知道的帮帮我,这些是我的模型和关系。(下面我会说明我要数据的方式)。
制造:(产品)
<?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 您在视图中指定的内容。
所以,步骤是:
创建调用控制器函数的路由
向该路由发送一个 ajax 请求,其中包含您要在邮件数据中应用的过滤器。
在控制器函数中接收过滤器的信息并创建查询。
路线
将路由添加到您的 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);