$users= User::join("roles","users.roles_id","=","roles.id")->where('users.estado','=',1)->get();$users= User::leftJoin("roles","users.roles_id","=","roles.id")->where('users.estado','=',1)->get();$users= User::join("roles","users.roles_id","=","roles.id")->leftJoin('posts',function($join){$join->on('users.posts_id','=','posts.id')->where('posts.estado','=',1);})->where('users.estado','=',1)->get();$users= User::join("roles","users.roles_id","=","roles.id")->leftJoin(DB::raw("(SELECT * FROM posts where posts.estado=1) as posts"),function($join){$join->on('users.posts_id','=','posts.id');})->where('users.estado','=',1)->get();
$sql = "SELECT * FROM users WHERE estado=? AND edad<?";
DB::select($sql,array(1,20));
$sql = "SELECT * FROM users WHERE estado=? AND edad<?";
DB::statement($sql,array(1,20));
$sql = "SET FOREIGN_KEY_CHECKS =0;DROP TABLE IF EXISTS `users`;DROP TABLE IF EXISTS `roles`;";
DB::unprepared($sql);
$file_sql = './data/consultas.sql';
$sql = file_get_contents($file_sql);
DB::unprepared($sql);
// Si pierdes la conexión, ejemplo cuando eliminas y vuelves a crear la base de datos, esta función te permite reconectar y seguir trabajando.
DB::reconnect();
$sql = "SELECT * FROM users WHERE estado=? AND edad<?";
DB::select($sql,array(1,20)); $sql = "SELECT * FROM users WHERE estado=? AND edad<?";
DB::statement($sql,array(1,20)); $sql = "SET FOREIGN_KEY_CHECKS = 0;DROP TABLE IF EXISTS `users`;DROP TABLE IF EXISTS `roles`;";
DB::unprepared($sql); $file_sql = './data/consultas.sql';
$sql = file_get_contents($file_sql);
DB::unprepared($sql); // Si pierdes la conexión, ejemplo cuando eliminas y vuelves a crear la base de datos, esta función te permite reconectar y seguir trabajando.
DB::reconnect();
Relaciones en Laravel
Convenciones de Eloquent Model
La tabla de un Modelo se le agrega la s, en plural. La tabla de la clase Post sería posts. La tabla de la clase ProductImage sería product_images. El campo primary key de una tabla debe tener el nombre de id, con el atributo AUTO_INCREMENT.
Estructura básica de la clase Post
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Post extends Model
{//}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//
}
Dentro de la clase podemos definir diferente a lo predeterminado
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Post extends Model
{// cambiar el nombre de la tablaprotected$table='my_post';// Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKeyprotected$primaryKey='id_post';// Todo modelo debe tener 2 campos created_at y updated_at, si no usamos esos campos en nuestra tabla// definimos de la siguiente manerapublic$timestamps=false;// Definir un nombre de conexión diferenteprotected$connection='connection-name';// Atributos que pueden ser asignados en App\Post::create(['name' => 'Article 1']);protected$fillable=['name'];// Todos los atributos se pueden asignar excepto priceprotected$guarded=['price'];}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// cambiar el nombre de la tabla
protected $table = 'my_post'; // Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey
protected $primaryKey = 'id_post'; // Todo modelo debe tener 2 campos created_at y updated_at, si no usamos esos campos en nuestra tabla
// definimos de la siguiente manera
public $timestamps = false; // Definir un nombre de conexión diferente
protected $connection = 'connection-name'; // Atributos que pueden ser asignados en App\Post::create(['name' => 'Article 1']);
protected $fillable = ['name']; // Todos los atributos se pueden asignar excepto price
protected $guarded = ['price'];
}
Uno a Uno
Ejemplo User y Phone estan relacionados uno a uno
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model
{/**
* Get the phone record associated with the user.
*/publicfunction phone(){return$this->hasOne('App\Phone');// Si el id tienen diferentes nombresreturn$this->hasOne('App\Phone','user_id','local_key');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the phone record associated with the user.
*/
public function phone()
{
return $this->hasOne('App\Phone');
// Si el id tienen diferentes nombres
return $this->hasOne('App\Phone', 'user_id', 'local_key');
}
}
Definimos la otra clase
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Phone extends Model
{/**
* Get the user that owns the phone.
*/publicfunction user(){return$this->belongsTo('App\User');// Si el id tienen diferentes nombresreturn$this->belongsTo('App\User','user_id','local_key');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
/**
* Get the user that owns the phone.
*/
public function user()
{
return $this->belongsTo('App\User');
// Si el id tienen diferentes nombres
return $this->belongsTo('App\User', 'user_id', 'local_key');
}
}
Uno a Muchos
Un Post tiene muchos Comentarios
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Post extends Model
{/**
* Get the comments for the blog post.
*/publicfunction comments(){return$this->hasMany('App\Comment');// Si el id tienen diferentes nombresreturn$this->hasMany('App\Comment','post_id','local_key');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* Get the comments for the blog post.
*/
public function comments()
{
return $this->hasMany('App\Comment');
// Si el id tienen diferentes nombres
return $this->hasMany('App\Comment', 'post_id', 'local_key');
}
}
Un Comentario pertenece a un Post
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Comment extends Model
{/**
* Get the post that owns the comment.
*/publicfunction post(){return$this->belongsTo('App\Post');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post');
}
}
Muchos a Muchos
Un Usuario tiene varios Roles
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model
{/**
* The roles that belong to the user.
*/publicfunction roles(){return$this->belongsToMany('App\Role');// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.return$this->belongsToMany('App\Role','user_roles','user_id','role_id');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The roles that belong to the user.
*/
public function roles()
{
return $this->belongsToMany('App\Role');
// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.
return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
}
}
Un Rol tiene varios Usuarios
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Role extends Model
{/**
* The users that belong to the role.
*/publicfunction users(){return$this->belongsToMany('App\User');// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.return$this->belongsToMany('App\User','user_roles','role_id','user_id');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* The users that belong to the role.
*/
public function users()
{
return $this->belongsToMany('App\User');
// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.
return $this->belongsToMany('App\User', 'user_roles', 'role_id', 'user_id');
}
}
Recuperando columnas de tablas intermedias
Definimos en la función withPivot los campos de la tabla intermedia
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model
{publicfunction roles(){return$this->belongsToMany('App\Role','user_roles')->withPivot('create','read','update','delete');}}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role', 'user_roles')
->withPivot('create', 'read','update', 'delete');
}
}
$users= User::from('users as a')->join('roles as b',function($join){$join->on('a.roles_id','=','b.id')->where('b.estado','=',1);})->select("a.*","b.name")->where('a.estado','=',1)->get();
$users = User::from('users as a')
->join('roles as b',function($join){
$join->on('a.roles_id','=','b.id')->where('b.estado','=',1);
})
->select("a.*","b.name")
->where('a.estado','=',1)
->get();
Ejemplo: Buscar un término
$search='Palabra a buscar';$posts= Post::from('posts as a')->where(function($query)use($search){$query=$query->orWhere('a.titulo','like',"%$search%");$query=$query->orWhere('a.descripcion','like',"%$search%");$query=$query->orWhere('a.tags','like',"%$search%");});$posts=$posts->where('a.estado','=',1)->get();
$search = 'Palabra a buscar';
$posts = Post::from('posts as a')
->where(function ($query) use ($search) {
$query = $query->orWhere('a.titulo','like',"%$search%");
$query = $query->orWhere('a.descripcion','like',"%$search%");
$query = $query->orWhere('a.tags','like',"%$search%");
});
$posts = $posts->where('a.estado','=',1)
->get();
Ejemplo: Buscando varias palabras en varias columnas
$columns=['titulo','descripcion','tags'];$term='Palabras a buscar';$words_search=explode(" ",$term);$posts= Post::from('posts as a')->where(function($query)use($columns,$words_search){foreach($words_searchas$word){$query=$query->where(function($query)use($columns,$word){foreach($columnsas$column){$query->orWhere($column,'like',"%$word%");}});}});$posts=$posts->where('a.estado','=',1)->get();
$columns = ['titulo','descripcion','tags'];
$term = 'Palabras a buscar';
$words_search = explode(" ",$term);
$posts = Post::from('posts as a')
->where(function ($query) use ($columns,$words_search) {
foreach ($words_search as $word) {
$query = $query->where(function ($query) use ($columns,$word) {
foreach ($columns as $column) {
$query->orWhere($column,'like',"%$word%");
}
});
}
});
$posts = $posts->where('a.estado','=',1)
->get();
Consultas con prefijo de tabla
En Laravel podemos configurar un prefijo a todas las tablas de nuestra Base de Datos, ese cambio lo realizamos en el archivo config/database.php, en la opción prefix. Si ponemos prefijo_ las tablas se llamarían prefijo_users
Si realizamos consultas simples no habría ningún problema con este cambio, pero cuando realizamos consultas complejas usando la función DB::raw es donde tenemos que obtener el prefijo y agregarlo a nuestra consulta. Con esta función obtenemos el prefijo.
$db_prefix= DB::getTablePrefix();
$db_prefix = DB::getTablePrefix();
Ahora dentro de la función DB::raw ingresamos el prefijo.
$users= App\User::join("roles","users.roles_id","=","roles.id")->leftJoin(DB::raw("(SELECT * FROM {$db_prefix}posts where {$db_prefix}posts.estado=1) as posts"),function($join){$join->on('users.id','=','posts.users_id');})->select(DB::raw("{$db_prefix}users.*"))->addSelect(DB::raw("DATE_FORMAT({$db_prefix}posts.created_at,'%d/%m/%Y %h:%i %p') AS posts_creado"))->where('users.estado','=',1)->where('posts.comments_count','>',0)->whereRaw(DB::raw("{$db_prefix}posts.tags !=''"))->get();
$users = App\User::join("roles","users.roles_id","=","roles.id")
->leftJoin(DB::raw("(SELECT * FROM {$db_prefix}posts where {$db_prefix}posts.estado=1) as posts"),
function($join){
$join->on('users.id','=','posts.users_id');
}
)
->select(DB::raw("{$db_prefix}users.*"))
->addSelect(DB::raw("DATE_FORMAT({$db_prefix}posts.created_at,'%d/%m/%Y %h:%i %p') AS posts_creado"))
->where('users.estado','=',1)
->where('posts.comments_count','>',0)
->whereRaw(DB::raw("{$db_prefix}posts.tags !=''"))
->get();
También tenemos que agregar el prefijo de las tablas cuando usamos consultas SQL puras.
$sql="SELECT * FROM {$db_prefix}users WHERE {$db_prefix}users.estado = ? AND {$db_prefix}users.edad < ?";
DB::select($sql,array(1,20));
$sql = "SELECT * FROM {$db_prefix}users WHERE {$db_prefix}users.estado = ? AND {$db_prefix}users.edad < ?";
DB::select($sql,array(1,20));
Consultas con SubQuery
$sub= Post::select(['id','titulo'])->where('estado','=',1);$count= DB::table( DB::raw("({$sub->toSql()}) as sub"))->mergeBindings($sub->getQuery())->count();