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