Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

subquerys

Estas en el tema de subquerys en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas noches Tengo lo siguientes modelos Código PHP: class  Activo  extends  Model {     protected  $table  =  'activos' ;     protected  $fillable  = [ 'nombre' ,  'abr' ,  ...
  #1 (permalink)  
Antiguo 21/09/2016, 18:47
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 9 meses
Puntos: 1
Sonrisa subquerys

Buenas noches

Tengo lo siguientes modelos

Código PHP:
class Activo extends Model{
    protected 
$table 'activos';

    protected 
$fillable = ['nombre''abr''clave''status_registro'];

    public function 
instalaciones()
    {
        return 
$this->hasMany('App\Instalacion''id_activo');
    }

    public function 
ductos()
    {
            return 
$this->hasMany('App\Ducto''id_activo');
    }
}

class 
Ducto extends Model
{
    protected 
$table 'ductos';

    protected 
$fillable = ['id_activo''id_tipo_ducto''diametro''kilometraje'];

    public function 
activo()
    {
        return 
$this->belongsTo('App\Activo''id_activo');
    }

    public function 
origen_destino()
    {
        return 
$this->hasMany('App\InstalacionDuctoOrigenDestino''id_ducto');
    }
}
class 
Instalacion extends Model
{
    protected 
$table 'catalogo_instalaciones';

    protected 
$fillable = ['id_activo','clave','nombre'];

    public function 
activo()
    {
        return 
$this->belongsTo('App\Activo''id_activo');
    }
}
class 
InstalacionDuctoOrigenDestino extends Model
{
    protected 
$table 'instalacion_ducto_origen_destino';

    protected 
$fillable = ['id_ducto''id_instalacion''tipo'];
    
    public function 
ducto()
    {
        return 
$this->belongsTo('App\Ducto''id_ducto');
    }

Le explico la relación:

1 activo tiene varios ductos
1 ducto tiene 1 origen y un destino, es decir por cada ducto agregado a la tabla ductos se agregan dos registros en la tabla instalacion_ducto_origen_destino, un registro que es el origen del ducto y el otro registro que es el destino del ducto (origen - destino).

De acuerdo a esta relacion, deseo imprimir una tabla que me muestre los registros tal y como muestro en la siguiente consulta sql:

Código:
SELECT
catalogo_ductos.id,
catalogo_activos.abr,
catalogo_tipo_ductos.nombre,
catalogo_instalaciones.clave,
catalogo_instalaciones.nombre,
catalogo_ductos.diametro,
catalogo_ductos.kilometraje,
(SELECT
		catalogo_instalaciones.nombre aS instalacion
	FROM
		catalogo_instalaciones
	INNER JOIN instalacion_ducto_origen_destino ON instalacion_ducto_origen_destino.id_instalacion = catalogo_instalaciones.id
	INNER JOIN catalogo_tipo_instalaciones ON catalogo_instalaciones.id_tipo_instalacion = catalogo_tipo_instalaciones.id
	WHERE
		instalacion_ducto_origen_destino.tipo = 'Origen'
	AND
		instalacion_ducto_origen_destino.id_ducto = catalogo_ductos.id) AS origen,
(SELECT
		catalogo_instalaciones.nombre aS instalacion
	FROM
		catalogo_instalaciones
	INNER JOIN instalacion_ducto_origen_destino ON instalacion_ducto_origen_destino.id_instalacion = catalogo_instalaciones.id
	INNER JOIN catalogo_tipo_instalaciones ON catalogo_instalaciones.id_tipo_instalacion = catalogo_tipo_instalaciones.id
	WHERE
		instalacion_ducto_origen_destino.tipo = 'Destino'
	AND
		instalacion_ducto_origen_destino.id_ducto = catalogo_ductos.id) AS destino
FROM
		catalogo_ductos
INNER JOIN catalogo_activos ON catalogo_ductos.id_activo = catalogo_activos.id
INNER JOIN catalogo_tipo_ductos ON catalogo_ductos.id_tipo_ducto = catalogo_tipo_ductos.id
INNER JOIN catalogo_instalaciones ON catalogo_instalaciones.id_activo = catalogo_activos.id
con todo lo anterior deseo utilizar eloquent para realizar esta consulta y subconsultas, de verdad no se como realizar una subconsulta, si pudieran orientarme o ayudarme ya que no he leido que puedo utilizar DB::raw para utilizar en forma nativa sql pero no deseo hacer eso ya que no tendria flexibilidad al momento de cambiar de gestor de base de datos, deseo utilizar el ORM para hacer esta consulta, llevo 2 días investigando pero no encuentro una respuesta o articulo que me aclare el panorama o me lleve a una respuesta acertada, gracias de antemano.
  #2 (permalink)  
Antiguo 22/09/2016, 06:58
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: subquerys

Tienes que usar una consulta nativa o una mezcla de DB::raw con el query builder.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 26/12/2016, 11:03
 
Fecha de Ingreso: junio-2007
Mensajes: 298
Antigüedad: 17 años, 5 meses
Puntos: 5
Respuesta: subquerys

Hola a todos, aprovecho este tema ya abierto para plantear mi subconsulta. Estoy intentando hacer en Laravel la siguiente subconsulta:

Código PHP:
Ver original
  1. select id_actor_orig1, id_actor_orig2, id_actor_orig3, id_actor_orig4,id_actor_doblaje1, id_actor_doblaje2,
  2. id_actor_doblaje3, id_actor_doblaje4,pel_doblaje.anno, pel_youtube.nom_pel_youtube, pel_doblaje.urlCorta, foto_pel_doblaje
  3. from pel_doblaje
  4.             INNER JOIN pel_youtube ON pel_youtube.id = pel_doblaje.id_pelicula
  5.             where
  6.             nom_pel_youtube like '%".$buscar."%' or
  7.             id_actor_orig1 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  8.             id_actor_orig1 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  9.             id_actor_orig2 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  10.             id_actor_orig3 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  11.             id_actor_orig4 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  12.             id_actor_doblaje1 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  13.             id_actor_doblaje2 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  14.             id_actor_doblaje3 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%') or
  15.             id_actor_doblaje4 in (select id from art_youtube where nom_art_youtube like '%".$buscar."%')
  16.             order by nom_pel_youtube

Me he leído todos los ejemplos de la documentación oficial pero no consigo montar en Laravel la consulta pero no hay manera.

Me podéis orientar un poco cómo sería en Laravel dicha consulta SQL.

Muchas gracias.

Última edición por schattenburg; 26/12/2016 a las 12:02
  #4 (permalink)  
Antiguo 26/12/2016, 13:06
 
Fecha de Ingreso: junio-2007
Mensajes: 298
Antigüedad: 17 años, 5 meses
Puntos: 5
Respuesta: subquerys

Tras probar muchas combinaciones conseguí obtener la consulta, la pongo aquí por si le puede servir de utilidad a otros:

Código PHP:
Ver original
  1. $arrAux = DB::table('pel_doblaje')
  2.             ->select('nom_art_youtube', 'id_actor_orig1', 'id_actor_orig2', 'id_actor_orig3')
  3.             ->join('pel_youtube', 'pel_youtube.id', '=', 'pel_doblaje.id_pelicula')
  4.             ->join('art_youtube', function($join){
  5.                 $join->on('art_youtube.id', '=', 'pel_doblaje.id_actor_orig1')
  6.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_orig2')
  7.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_orig3')
  8.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_orig4')
  9.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_doblaje1')
  10.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_doblaje2')
  11.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_doblaje3')
  12.                 ->orOn('art_youtube.id', '=', 'pel_doblaje.id_actor_doblaje4')
  13.                 ;
  14.             })
  15.             ->where('nom_pel_youtube', 'like', '%'.$cadena.'%')
  16.             ->orWhere('nom_art_youtube', 'like', '%'.$cadena.'%')
  17.             ->get();
  #5 (permalink)  
Antiguo 29/12/2016, 09:02
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 568
Antigüedad: 19 años
Puntos: 25
Respuesta: subquerys

Lo que no entiendo es: La consula SQL que tienes ahi ya funciona? por qué no usas esa consulta?
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida
  #6 (permalink)  
Antiguo 23/01/2017, 08:10
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 10 años, 4 meses
Puntos: 30
Respuesta: subquerys

Antes de comenzar decirte que en tienes un par de errores con las clases:
- clase Activo, la tabla ha de ser 'catalogo_activos'.
- clase Ducto, la tabla ha de ser 'catalogo_ductos'.

Código PHP:
// Primero creas los subqueries por separado
$sub1 Instalacion::select('nombre')
                 ->
join('instalacion_ducto_origen_destino''instalacion_ducto_origen_destino.id_instalacion''=''catalogo_instalaciones.id')
                 ->
join('catalogo_tipo_instalaciones''catalogo_instalaciones.id_tipo_instalacion''=''catalogo_tipo_instalaciones.id')
                 ->
join('catalogo_ductos''catalogo_ductos.id''=''instalacion_ducto_origen_destino.id_ducto')
                 ->
where('instalacion_ducto_origen_destino.tipo''Origen');

$sub2 Instalacion::select('nombre')
                 ->
join('instalacion_ducto_origen_destino''instalacion_ducto_origen_destino.id_instalacion''=''catalogo_instalaciones.id')
                 ->
join('catalogo_tipo_instalaciones''catalogo_instalaciones.id_tipo_instalacion''=''catalogo_tipo_instalaciones.id')
                 ->
join('catalogo_ductos''catalogo_ductos.id''=''instalacion_ducto_origen_destino.id_ducto')
                 ->
where('instalacion_ducto_origen_destino.tipo''Destino');

Ducto::select('id''abr''catalogo_tipo_ductos.nombre''clave''catalogo_instalaciones.nombre''diametro''kilometraje'DB::raw("({$sub1->toSQL()}) as Origen"), DB::raw("({$sub2->toSQL()}) as Destino"))
         ->
join('catalogo_activos''catalogo_ductos.id_activo''=''catalogo_activos.id')
         ->
join('catalogo_tipo_ductos''catalogo_ductos.id_tipo_ducto''=''catalogo_tipo_ductos.id')
         ->
join('catalogo_instalaciones''catalogo_instalaciones.id_activo''=''catalogo_activos.id')
         ->
get();
         
         
/*Yo no lo he probado esa consulta, espero que te funcione, si no, prueba de incluirle antes del get() esto:
         ->mergeBindings($sub1->getQuery())
         ->mergeBindings($sub2->getQuery())

         y si aún así no te funciona, pues te deseo mucha suerte pero ya tienes una idea más clara
         
         Nota: INNER JOIN = join() y LEFT JOIN = leftjoin()*/ 

Por otra parte yo te recomendaría que utilizases una nomenclatura más simple y sencilla para todas las tablas y campos, la verdad que es muy fácil equivocarse a cada rato con esos nombres y debe de cansar muchisimo trabajar así.

Última edición por Triby2; 24/01/2017 a las 22:23 Razón: me faltó un dato

Etiquetas: laravel, query, subquery
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:24.