Bonjour,

Je suis en train de concevoir une requête afin de générer un menu (contenant des thématiques). Ma première requête fonctionne. J'arrive à récupérer l'ensemble de mes thématiques et de mes sous-thématiques. Voici mon code

<?php
$thematicsparent = Thematic::where('parent_id', 0)->orderBy('lft')->get()->keyBy('id');
        foreach ($thematicsparent as $k => $v){
            $thematicschild = Thematic::where('parent_id', $k)
                ->orderBy('lft')
                ->get()
                ->keyBy('id');
            if($thematicschild) {
                $thematicsparent[$k]['child'] = $thematicschild;
            }
        }
 ?>

Ce que j'ai comme structure de base de donnée

J'ai 2 tables, la première est une table "Thematics" qui contient un id, 'title, lft,rght,parent_id. Ma seconde table, la table "Posts" contient un id, title, content.....thematic_id.
Vous trouverez ci-dessous, mes 2 models.
App/Thematic:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Thematic extends Model
{
    protected $table = 'thematics';
    public $timestamps = true;
    protected $fillable = array('title', 'descr', "position");
    public function post() {
        return $this->belongsTo('App\Post', 'id', 'thematic_id');
    }
}
?>

App/Post

<?php
namespace App;
use Nicolaslopezj\Searchable\SearchableTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Session;
class Post extends Model
{
    use SearchableTrait, \Conner\Tagging\Taggable;
    protected $table = 'posts';
    public $timestamps = true;
    protected $fillable = ['title', 'subtitle', 'content', 'city_id', 'location_id'];
    ......
    public function thematic() {
        return $this->belongsTo('App\Thematic');
    }
 ?>

Ce que je fais

D'après mes recherches, je pense que la fonctionnalité "whereHas" serait la bonne solution. Cependant, cela ne fonctionne pas. Je ne comprend pas si c'est ma structuration de code qui ne marche pas, ou que je n'utilise pas la bonne fonctionnalité de laravel. Voici mon code:

<?php
$thematicschild = Thematic::where('parent_id', $k)
                ->whereHas('posts', '>', 0)
                ->orderBy('lft')
                ->get()
                ->keyBy('id');

Ce que je veux

Je souhaiterais en fait, générer un code qui me permettrait de récupérer uniquement les thématiques et sous-thématiques qui contiennent des articles. Je précise que celle les sous-thématiques contiennent des articles.

Ce que j'obtiens

Actuellement, je n'ai aucun retour, page blanche.
Au niveau de mon controller, j'utilise un petit code de débug afin de voir s'il y a bel et bien un retour au niveau de la requête.

<?php
echo "<pre>";
print_r($thematics);
echo "</pre>";
exit();
?>

Merci d'avance pour l'aide que vous pourriez m'apporter.

leknoppix

1 réponse


leknoppix
Auteur
Réponse acceptée

J'ai finalement trouvé

Voici mon code si certains d'entre vous se pose la question:

<?php
$thematicschild = Thematic::where('parent_id', $k)
                ->whereHas('post',function ($query) {
                    $query->where('title', '!=', '0');
                })
                ->orderBy('lft')
                ->get()
                ->keyBy('id');
                ?>