Laravel 版本是 5.4
这里我放了项目的链接下载(包括要导入的数据库。它在 App/filtros_laravel.sql 中) https://www.dropbox.com/s/or78bfgg71xmlmp/filtros.zip?dl=0
我将描述问题。让我们先从表格开始。
create table clientes
(
idcliente int primary KEY AUTO_INCREMENT NOT NULL,
nombre varchar(35) not null,
telefono varchar(30) null
);
create table pagos
(
idpago int primary KEY AUTO_INCREMENT NOT NULL,
nombre_pago varchar(35) not null,
idcliente int not null,
idestado int not null
);
CREATE TABLE estado_pagos
(
idestado int primary KEY AUTO_INCREMENT NOT NULL,
nombre_pago varchar(30) not null
);
ALTER TABLE pagos ADD FOREIGN KEY(idcliente) REFERENCES clientes(idcliente);
ALTER TABLE pagos ADD FOREIGN KEY(idestado) REFERENCES estado_pagos(idestado);
它基本上说客户有很多付款。付款属于 status_payment(pending,paid)。例子:
idcliente:1
nombre:Carlos
telefono: 391929
Pagos de carlos:
idpago:1,nombre_pago:pago1,idcliente:1,idestado:1,nombre_pago:Pendiente
idpago:2,nombre_pago:pago2,idcliente:1,idestado:1,nombre_pago:Pendiente
idpago:3,nombre_pago:pago3,idcliente:1,idestado:3,nombre_pago:Pagado
idcliente:2
nombre:Juliana
telefono: 122222
Pagos:
idpago:4,nombre_pago:pago julio,idcliente:1,idestado:1,nombre_pago:pendiente
idpago:5,nombre_pago:pago agosto,idcliente:1,idestado:3,nombre_pago:pagado
idpago:6,nombre_pago:pago promociones,idcliente:1,idestado:3,nombre_pago:pagado
tabla estados
idestado:1
nombre_pago:Pendiente
idestado:2
nombre_pago:No valido
idestado:3
nombre_pago:Pagado
我需要你把客户的所有付款都带给我,并支付状态。换句话说,您不应该让客户处于待处理付款状态。只有付费的。我的意思是你应该像这样带它
idcliente:1
nombre:Carlos
telefono: 391929
Pagos:
idpago:3,nombre_pago:pago1,idcliente:1,idestado:3,nombre_pago:Pagado
idcliente:2
nombre:Juliana
telefono: 122222
Pagos:
idpago:2,nombre_pago:pago1,idcliente:1,idestado:3,nombre_pago:Pagado
idpago:3,nombre_pago:pago1,idcliente:1,idestado:3,nombre_pago:Pagado
Laravel 中的模型是这样的
示范客户
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Cliente extends Model
{
protected $table = 'clientes';
protected $primaryKey = 'idcliente';
public $timestamps = false;
public function pagos()
{
return $this->hasMany('App\Pago', 'idcliente');
}
}
支付模式
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pago extends Model
{
protected $table = 'pagos';
protected $primaryKey = 'idpago';
public $timestamps = false;
public function cliente()
{
return $this->belongsTo('App\Cliente', 'idcliente');
}
public function estado()
{
return $this->belongsTo('App\EstadoPago', 'idestado');
}
}
Status_payments 模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class EstadoPago extends Model
{
protected $table = 'estado_pagos';
protected $primaryKey = 'idestado';
public $timestamps = false;
public function pagos()
{
return $this->hasMany('App\Pago', 'idestado');
}
}
控制器是这样的
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Cliente;
use App\Pago;
use App\EstadoPago;
class ClienteController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$clientes = cliente::with('pagos.estado')->whereHas('pagos.estado', function ($query) {
$query->where('nombre_pago', '=', 'pagado');
})->get();
return json_encode($clientes);
}
}
我如何制作那个过滤器?我正在与 Eloquent 打交道。我试过 whereHas 和 "with" 都不起作用。whereHas 对我不起作用。它不断向我显示所有处于待处理和已付款状态的付款。我只希望它向我显示上面示例中提到的状态为已付款的付款。在示例中应该是这样的。这:whereHas('pagos.estado')
它只是进入 Customer 模型,然后进入 Payment Model,然后进入 Payment_Status 模型。然后这个过滤器在 Payment_Status
$query->where('nombre_pago', '=', 'pagado');
但它不起作用,我该怎么做那个过滤器?它与 whereHas 或其他,因为它对我也不起作用。
public function index()
{
$clientes = cliente::with('pagos.estado')->with(['pagos.estado' => function ($query) {
$query->where('nombre_pago', '=', 'pagado');
}])->get();
return json_encode($clientes);
}
我以 json 格式返回它,因为这样我可以更好地查看数据。我在这个页面上查看 json 的结果
http://www.jsoneditoronline.org/
我看到客户的付款和付款状态。都在同一个对象中。
这向我展示了一个对象。更清楚地理解它。
我需要以这种方式执行过滤器。这可以通过 idstate = 3 过滤来完成,但这不是我需要的。过滤器是按名称完成的。这是因为我有这种类型的查询,过滤到其他表。我不能按 id 进行过滤。我想要并且需要名字。请帮忙。我搜索了很多关于视频、stackoverflow 和其他部分的内容。在英语和西班牙语中,我找不到任何东西。我真的很努力。我非常努力地使这个问题变得非常详细和清晰。我坚持这一点,它真的很有帮助。加入它可以完成,但这不是我想要的。我只是在寻找具有说服力的过滤器。没有加入。
好吧,虽然从 Laravel 的工作方式和作为动态属性工作的关系的角度来看,你想要做的可能有点特别和极端,但这里是解决方案: