jeudi 25 avril 2019

How do I see published posts count with Eloquent using a ServiceProvider

I have a Blog Categories in the sidebar.blade.php

@foreach ($categories as $category)
<li>
<a href=""><i class="fa fa-angle-  right"></i> </a>
<span class="badge pull-right"></span>
</li>
@endforeach

But this count give me all the posts in my database, even the ones that are scheduled to post at a later date.

PostsController

namespace App\Http\Controllers;
use Illuminate\Http\Request;

use App\Post;
use App\Category;


class PostsController extends Controller
{

protected $limit = 3;

public function index()
{

    $posts = Post::with('author')
                ->latestFirst()
                ->published()
                ->paginate($this->limit);

    return view('posts.index', compact('posts'));
}
public function category(Category $category)
{
    $categoryName = $category->title;

    $posts = $category->posts()
                  ->with('author')
              ->latestFirst()
              ->published()
              ->paginate($this->limit);

    return view('posts.index', compact('posts', 'categoryName'));
}

Here's the Post.php namespace App;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use GrahamCampbell\Markdown\Facades\Markdown;

class Post extends Model
{
//Table Name
protected $table = 'posts';
// Primary Key
   public $primaryKey = 'id';
// Timestamps
   public $timestamps = true;

/*protected $fillable = [
    'title',
    'excerpt',
    'body',
    'categery_id',
    'image',

];*/

protected $dates = ['published_at'];


public function author()
{
return $this->belongsTo(User::class);
}

public function category()
{
return $this->belongsTo(Category::class);
}

public function getImageUrlAttribute($value)
{
$imageUrl = "";
if( ! is_null($this->image))
{
$imagePath = public_path() . "/img/" . $this->image;
if(file_exists($imagePath)) $imageUrl = asset("img/" . $this->image);
}
return $imageUrl;
}
public function getDateAttribute()
{
return is_null($this->published_at) ? '' :   $this->published_at->diffForHumans();  
}
public function getExcerptHtmlAttribute(){
return $this->excerpt ? Markdown::convertToHtml(e($this->excerpt)) : NULL;
}

public function getBodyHtmlAttribute()
{
return $this->body ? Markdown::convertToHtml(e($this->body)) : NULL;
}

public function scopeLatestFirst($query)
{
return $query->orderBy('published_at', 'desc');
}

public function scopePublished($query)
{
return $query->where('published_at', '<=', Carbon::now());
}

}

Here's my Category.php

namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';

/*protected $fillable = [
    'title',
    'excerpt',
    'body',
    'categery_id',
    'image',
    'slug'

];*/

public function posts()
{
return $this->hasMany(Post::class);
}

public function getRouteKeyName()
{
return 'slug';
}
}

Web.php

Route::get('/', 'PagesController@index');
Route::get('/about', 'PagesController@about');
Route::get('/category/{category}', [ 
'uses' => 'PostsController@category',
'as' => 'category'
]);

Route::resource('books', 'BooksController');
Route::resource('posts', 'PostsController');
Route::resource('categories', 'CategoriesController', ['except'=>  ['create']]);

ComposerServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Category;
use App\Post;

class ComposerServiceProvider extends ServiceProvider
{

public function boot()
{
view()->composer('layouts.sidebar', function($view){
$categories = Category::with(['posts' => function($query){
$query->published();
}])->orderBy('title', 'asc')->get();
return $view->with('categories', $categories);
});
}
}

To recap on what I need done...

I want to just have my published post to be accounted for in the counter to show, not all the of the posts in my database..

(<span class="badge pull-right"></span>)

Post.php

public function scopePublished($query)
{
return $query->where('published_at', '<=', Carbon::now());
}

But this is not working right for me, does anyone know why?



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire