构建一个复杂的Laravel SQL查询

时间:2019-03-14 13:19:30

标签: sql laravel laravel-5 eloquent

我有一个相当复杂的问题。

首先,这是我的模型:

1)标签Adybooks

 <?php namespace App; use App\Livres; use Illuminate\Database\Eloquent\Model; use Auth; class tagsAdybooks extends Model {
public function getid()
{

    return $this->id;
}

/**
* Protège une table 
* @var string 
*/
protected $table = 'tags_adybooks';

 /**
 * Permet de voir quel champs sont modifiable
 * @var array
 */
protected $fillable = [
     'titre_fr','titre_en','slug_fr','slug_en','numero','principal','tags_adybooks_id'];

/**
*Annule la fonction create et update automatique
* @var bool
*/
public $timestamps = false;


 /*
* Liaison livres et Tags
*/
public function livres(){

    return $this->belongsToMany(Livres::class,'livres_has_tags_adybooks');

}

public function livresTags(){

    return $this->belongsToMany(Livres::class,'livres_has_tags_adybooks')->where('nouveaute','=',1)->where('actif','=',1)->whereHas('disponible',function ($query){
        $query->where('id','=',1);
    })->orderBy('id','desc');

}


public function livresOffice(){
    return $this->belongsToMany(Livres::class,'livres_has_tags_adybooks')->where('date_office','desc')->get()->groupBy('date_office');
}

public function children() {
    return $this->hasMany( tagsAdybooks::class,'tags_adybooks_id','id')->orderBy('titre_'.\App::getLocale(),'asc')->has('livres');
}
public function parent() {
    return $this->belongsTo(tagsAdybooks::class,'tags_adybooks_id');
}

2)Livres:

<?php namespace App; use Illuminate\Database\Eloquent\Model; use Auth;use Cart; use Carbon\Carbon;  class Livres extends Model{
/**
* Protège une table 
* @var string 
*/
protected $table = 'livres';



 /**
 * Permet de voir quel champs sont modifiable
 * @var array
 */
protected $fillable = [
     'titre','sous_titre','description','photo','apercu','video','disponibilite','prix_ttc','prix_promo','langue',
    'isbn','ean_13','date_parution','date_office','format','prix_lancement','faconnage','nbre_page','typesID','collection','clil','nouveaute'];

/**
*Annule la fonction create et update automatique
* @var bool
*/
public $timestamps = false;
protected $casts = [
    'clil' => 'array',
];
/*
* Liaison like et livres :
*/
public function likes()
{
    return $this->morphToMany(User::class, 'like')->whereDeletedAt(null);
}
public function tagAdybooks(){
    return $this->belongsToMany(tagsAdybooks::class,'livres_has_tags_adybooks');
}

我希望他们选择所有主要的有书的标签书或所有主要的及其孩子的书标签

为此,我尝试了一个联合:$tags=tagsAdybooks:: join('livres_has_tags_adybooks', 'tags_adybooks.id', '=', 'livres_has_tags_adybooks.tags_adybooks_id') ->join('livres', 'livres_has_tags_adybooks.livres_id', '=', 'livres.id') ->select( 'tags_adybooks.*')->orderBy('titre_'.App::getLocale(),'asc')->where(function($q){ $q->whereHas('livres');$q->orWhereHas('children');})->get();

或其他请求:$tags=tagsAdybooks::where('principal','=',1)->orderBy('titre_'.App::getLocale(),'asc')->whereHas('children')->has('livres')->get();

不幸的是,我得到的是带有书籍的主要标签书或所有不是主要标签的书。你能帮我个忙吗?

我想了解我的错误在哪里?

2 个答案:

答案 0 :(得分:0)

能否请您尝试下面的查询,我同时建立了一个查询。

tagsAdybooks:: join('livres_has_tags_adybooks', 'tags_adybooks.id', '=', 'livres_has_tags_adybooks.tags_adybooks_id')
        ->join('livres', 'livres_has_tags_adybooks.livres_id', '=', 'livres.id')
        ->select( 'tags_adybooks.*')
        ->orderBy('titre_'.App::getLocale(),'asc')
        ->where(function($q){
            $q->whereHas('livres');
            $q->orWhereHas('children');
         })
         ->orWhere(function($q){
            $q->where('principal','=',1)
            $q->whereHas('children')
            $q->has('livres')
         })
         ->get();

答案 1 :(得分:0)

我通过改变策略找到了解决方案。这是我的解决方法:
$principale=tagsAdybooks::where('principal','=',1)->orderBy('titre_'.App::getLocale(),'asc')->has('livres')->get(); $nonprincipale= tagsAdybooks::where('principal','=',0)->orderBy('titre_'.App::getLocale(),'asc')->has('livres')->get()// $pole = Pole::where('slug','=',$poleSlug)->first();// $categories = $pole->listeCategories; $tags= new \Illuminate\Database\Eloquent\Collection; foreach ($nonprincipale as $categorie){ $tags = $tags->push($categorie->parent); $tags= $tags->flatten()->unique('id'); } $tags = $tags->merge($principale); $tags= $tags->flatten()->unique('id');