【问题标题】:Building a complex Laravel SQL query构建复杂的 Laravel SQL 查询
【发布时间】:2019-08-05 09:54:50
【问题描述】:

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

首先,这是我的模型:

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) 利弗斯:

<?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');
}

我希望他们选择所有主要的有书的tagsadybooks 或所有主要的tagsadybooks 并且他们的孩子有书

为此,我尝试了一个联合:$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)-&gt;orderBy('titre_'.App::getLocale(),'asc')-&gt;whereHas('children')-&gt;has('livres')-&gt;get();

不幸的是,我得到了包含书籍的主要 tagsadybooks 或所有 tagsadybooks 但不是主要的。请给我一个线索好吗?

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

【问题讨论】:

    标签: sql laravel laravel-5 eloquent


    【解决方案1】:

    你能试试下面的查询吗,我用两者都建立了一个查询。

    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();
    

    【讨论】:

    • 首先感谢您的回答。当我提出你的要求时。我得到了包含书籍和非主要书籍的 mainAdybooks 标签。我只得到了预期结果的一半。 :( 我添加了一个不同的以避免重复
    【解决方案2】:

    我通过改变策略找到了解决方案。这是我的解决方案:
    $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');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多