PaliText.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Database\Eloquent\Builder;
  6. class PaliText extends Model
  7. {
  8. use HasFactory;
  9. protected $fillable = ['book', 'paragraph', 'level', 'class', 'toc', 'text', 'html', 'lenght'];
  10. public function progressChapters()
  11. {
  12. return $this->hasMany(ProgressChapter::class, null, null)
  13. ->whereColumn('progress_chapters.book', 'pali_texts.book')
  14. ->whereColumn('progress_chapters.para', 'pali_texts.paragraph');
  15. }
  16. public function tagMaps()
  17. {
  18. return $this->hasMany(TagMap::class, 'anchor_id', 'uid');
  19. }
  20. public function scopeWithAllTags(Builder $query, array $tagNames): Builder
  21. {
  22. foreach ($tagNames as $name) {
  23. $query->whereHas('tagMaps.tags', function ($q) use ($name) {
  24. $q->where('name', $name);
  25. });
  26. }
  27. return $query;
  28. }
  29. /**
  30. * 标签多的优化版
  31. * public function scopeWithAllTags(Builder $query, array $tagNames): Builder
  32. {
  33. $count = count($tagNames);
  34. $query->whereIn('uid', function ($sub) use ($tagNames, $count) {
  35. $sub->select('tm.anchor_id')
  36. ->from('tag_maps as tm')
  37. ->join('tags as t', 't.id', '=', 'tm.tag_id')
  38. ->whereIn('t.name', $tagNames)
  39. ->groupBy('tm.anchor_id')
  40. ->havingRaw('COUNT(DISTINCT t.name) = ?', [$count]);
  41. });
  42. return $query;
  43. }
  44. */
  45. }