Как узнать количество опубликованных постов в Eloquent с помощью ServiceProvider? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть Категории блогов в sidebar.blade.php

@foreach ($categories as $category)
<li>
<a href="{{ route('category', $category->slug)}}"><i class="fa fa-angle-  right"></i> {{$category->title}}</a>
<span class="badge pull-right">{{$category->posts()->count()}}</span>
</li>
@endforeach

Но это количество дает мне все сообщения в моей базе данных, даже те, которые планируется опубликовать позднее.

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

Вот приложение пространства имен Post.php;

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

}

Вот мой 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);
});
}
}

Подводя итог тому, что мне нужно сделать ...

Я хочу, чтобы мой опубликованный пост учитывался в счетчике, чтобы показывать, а невсе сообщения в моей базе данных ..

(<span class="badge pull-right">{{$category->posts->count()}}</span>)

Post.php

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

Но это не работает для меня, кто-нибудь знает почему?

1 Ответ

0 голосов
/ 26 апреля 2019

Попробуйте это:

<span class="badge pull-right">{{$category->posts()->published()->count()}}</span>

Не пытался, но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...