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, 19:47
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 146
Antigüedad: 7 años, 11 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, 07:58
Avatar de hhs
hhs
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.718
Antigüedad: 3 años, 6 meses
Puntos: 323
Respuesta: subquerys

Tienes que usar una consulta nativa o una mezcla de DB::raw con el query builder.
__________________
Saludos
A class should have only one reason to change.
Laraveles
  #3 (permalink)  
Antiguo 26/12/2016, 11:03
 
Fecha de Ingreso: junio-2007
Mensajes: 259
Antigüedad: 9 años, 7 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: 259
Antigüedad: 9 años, 7 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: 508
Antigüedad: 11 años, 2 meses
Puntos: 18
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



La zona horaria es GMT -6. Ahora son las 06:53.