count() возвращает мягко удаленные элементы в laravel

У меня есть модель Comments, в которой используется обратимое удаление: она имеет отношения one-to-many с моей моделью Post.

С моим сайтом будет связано родное мобильное приложение, и мне нужно отправить ему количество комментариев, когда я отправляю информацию о публикации, и по какой-то причине он возвращает количество С мягко удаленными элементами.

У меня есть массив сообщений, который работает и отправляет количество комментариев, используя

protected $appends = array('score','commentcount', 'ups', 'downs');

и

public function getCommentcountAttribute()
{    
     return DB::table('comments')
         ->where('post_id',$this->id)
         ->where('deleted_at','=',NULL)
         ->count();    
}

в моей почтовой модели. я тоже пробовал

public function getCommentcountAttribute()
{
    return $this->comments()->count();
}

и

public function getCommentcountAttribute()
{   
    return $this->comments()->whereNull('deleted_at')->count();
    // also: return $this->comments()->where('deleted_at',NULL)->count();
}

также при определении отношения я безуспешно пытался добавить ->whereNUll('deleted_at') как к ->hasMany('Comment'), так и к ->belongsTo('Post').

Я проверил базу данных и запустил SQL, который, как я ожидаю, будет генерировать Fluent и Eloquent, который

SELECT * FROM `comments` WHERE post_id=31 and deleted_at=null

(31 — это пост, который я использую для тестирования). Ничего не работает. Дайте мне знать, если вам, ребята, нужно увидеть больше конкретных функций, так как я бы не хотел публиковать свои модели целиком.


person MrJellyhands    schedule 10.01.2014    source источник


Ответы (4)


Я смог заставить его работать с ->whereRaw('deleted_at = ?',array(NULL)). Хотя мне это кажется довольно хакерским. Я бы с радостью принял лучший ответ.

person MrJellyhands    schedule 10.01.2014

Вы должны включить мягкое удаление в своей модели.

class Comment extends Eloquent {

    protected $softDelete = true;

}

Вот и все.

И вам не нужно включать следующие предложения where в ваши запросы:

return DB::table('comments')
         ->where('post_id',$this->id)
         //->where('deleted_at','=',NULL) // no needed, Laravel by default will include this condition
         ->count();   


public function getCommentcountAttribute()
{   
   // remove  ->whereNull('deleted_at')
   return $this->comments()->count();
}
person Anam    schedule 10.01.2014
comment
Должен был включить, что я уже сделал это. Мягкое удаление работает везде, кроме случаев, когда я использую ->toArray() и count() - person MrJellyhands; 12.01.2014

Измените свой код на:

return \App\Comments::count();

Мягкое удаление работает только с моделями, а не с запросами:

class Comment extends Eloquent
{
    protected $softDelete = true;

}
person risafov    schedule 04.11.2015

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

Для laravel V5 и выше.

Добавьте use SoftDeletes; к вашей модели.

Если вы пытаетесь получить количество, включающее обратимые удаления, используйте следующее:

Model::withTrashed()->'yourquery'

Если вы не хотите включать обратимо удаленные записи, вы можете следовать обычной конвекции.

Model::select()->get(); 
person Daniel Lord    schedule 28.02.2020