Построение сложного SQL-запроса Laravel - PullRequest
0 голосов
/ 14 марта 2019

У меня довольно сложная проблема.

Прежде всего, вот мои модели:

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 голосов
/ 14 марта 2019

Я нашел решение, изменив мою стратегию. Вот мое решение:
$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');

0 голосов
/ 14 марта 2019

Можете ли вы попробовать следующий запрос, я строю запрос с обоими.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...