Данные пагинатора плохо отображаются в livewire «общедоступная собственность [сообщения] должна иметь тип: [числовой, строковый, массив, нулевой или логический]»

#php #laravel

Вопрос:

Мне нравится использовать livewire вместо контроллера

 public function index()
{
  return view('advert.index', [
'posts' => Advert::latest()->filter(
            request(['search', 'category', 'author'])
        )->paginate(18)->withQueryString()
  ]);
}
 

в живом проводе <livewire:advert.home :querys="request(['search', 'category', 'author'])">

 public function mount($querys)
{
    $this->querys = $querys;
}

public function render()
{
    $this->posts = Advert::latest()->filter([$this->querys])->paginate($this->perPage)->withQueryString();
}
 

но ничего не работает
, это в основном говорят

Общедоступное свойство компонента Livewire [advert.home] [сообщения] должно иметь тип: [числовое, строковое, массивное, нулевое или логическое значение]. Только защищенные или частные свойства могут быть заданы как другие типы, поскольку JavaScript не нуждается в доступе к ним.

Я заблудился, я использую это, но это плохо работает и показывает ошибку выше. и посмотрите те же данные, переданные компоненту livewire.

и нет никакой разницы между livewire $this->сообщения и «сообщения» от контроллера, я не могу этого понять.

например, «сообщения» dd($сообщения) от контроллера

 IlluminatePaginationLengthAwarePaginator {#1412 ▼
  #total: 2
  #lastPage: 1
  #items: IlluminateDatabaseEloquentCollection {#1402 ▼
    #items: array:2 [▼
      0 => AppModelsAdvert {#1409 ▼
        #with: array:3 [▶]
        #fillable: array:8 [▶]
        #connection: "mysql"
        #table: "adverts"
        #primaryKey: "id"
        #keyType: "int"
         incrementing: true
        #withCount: []
         preventsLazyLoading: false
        #perPage: 15
         exists: true
         wasRecentlyCreated: false
        #attributes: array:12 [▶]
        #original: array:12 [▶]
        #changes: []
        #casts: []
        #classCastCache: []
        #dates: []
        #dateFormat: null
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: array:3 [▶]
        #touches: []
         timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
      1 => AppModelsAdvert {#1410 ▼
        #with: array:3 [▶]
        #fillable: array:8 [▶]
        #connection: "mysql"
        #table: "adverts"
        #primaryKey: "id"
        #keyType: "int"
         incrementing: true
        #withCount: []
         preventsLazyLoading: false
        #perPage: 15
         exists: true
         wasRecentlyCreated: false
        #attributes: array:12 [▶]
        #original: array:12 [▶]
        #changes: []
        #casts: []
        #classCastCache: []
        #dates: []
        #dateFormat: null
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: array:3 [▶]
        #touches: []
         timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
    ]
  }
  #perPage: 18
  #currentPage: 1
  #path: "https://awento.ddns.net/search"
  #query: []
  #fragment: null
  #pageName: "page"
   onEachSide: 3
  #options: array:2 [▶]
}
 

и livewire $это->сообщения

ddd($сообщений)

 IlluminatePaginationLengthAwarePaginator {#1470 ▼
  #total: 2
  #lastPage: 1
  #items: IlluminateDatabaseEloquentCollection {#1458 ▼
    #items: array:2 [▼
      0 => AppModelsAdvert {#1465 ▼
        #with: array:3 [▶]
        #fillable: array:8 [▶]
        #connection: "mysql"
        #table: "adverts"
        #primaryKey: "id"
        #keyType: "int"
         incrementing: true
        #withCount: []
         preventsLazyLoading: false
        #perPage: 15
         exists: true
         wasRecentlyCreated: false
        #attributes: array:12 [▶]
        #original: array:12 [▶]
        #changes: []
        #casts: []
        #classCastCache: []
        #dates: []
        #dateFormat: null
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: array:3 [▶]
        #touches: []
         timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
      1 => AppModelsAdvert {#1467 ▼
        #with: array:3 [▶]
        #fillable: array:8 [▶]
        #connection: "mysql"
        #table: "adverts"
        #primaryKey: "id"
        #keyType: "int"
         incrementing: true
        #withCount: []
         preventsLazyLoading: false
        #perPage: 15
         exists: true
         wasRecentlyCreated: false
        #attributes: array:12 [▶]
        #original: array:12 [▶]
        #changes: []
        #casts: []
        #classCastCache: []
        #dates: []
        #dateFormat: null
        #appends: []
        #dispatchesEvents: []
        #observables: []
        #relations: array:3 [▶]
        #touches: []
         timestamps: true
        #hidden: []
        #visible: []
        #guarded: array:1 [▶]
      }
    ]
  }
  #perPage: 15
  #currentPage: 1
  #path: "https://awento.ddns.net"
  #query: []
  #fragment: null
  #pageName: "page"
   onEachSide: 3
  #options: array:2 [▶]
}
 

Комментарии:

1. сделайте dd($this->сообщения) в методе рендеринга и посмотрите, что вы получаете, кажется, это неправильное значение для рендеринга livewire

2. @Prospero спасибо, теперь я обновил эту полезную информацию.

Ответ №1:

После некоторых проб и ошибок я понимаю, что проблема связана с целыми данными, если мы организуем данные в той или иной форме, то проблем не будет. Итак, теперь я создаю массив для передачи данных с помощью некоторого foreach. Если есть другой лучший способ, пожалуйста, дайте мне знать.

     $postss = Advert::latest()->filter($this->querys)->paginate($this->perPage)->withQueryString();
    $posts = array();
    
    foreach($postss as $post)
    {
        array_push($posts, $post);
    }
    $this->posts = $posts;
 

Похоже, что разбиение на страницы сейчас не работает в livewire с использованием limit.