Ответ 1
Это документированное изменение в PHP 7.2. Вам нужно либо обновить Laravel до версии 5.6, либо обновить PHP до версии 7.1.
Я сталкиваюсь со странным случаем. Я сталкиваюсь с ошибкой в производственной среде, а не в dev, она работает нормально.
Разработка: Laravel 5.4.28 PHP 7.0.13 MYSQL 5.7.17
Производство: Laravel 5.4.28 PHP 7.2.1 MYSQL 5.7.20
В коде реализации. Я использовал:
namespace App;
use Illuminate\Support\Facades\Storage;
use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;
class Artwork extends Model
{
use Searchable;
В разработке все работает нормально. Но в производстве это дает мне эту ошибку: count(): параметр должен быть массивом или объектом, который реализует счетное в Builder.php (строка 936)
как вы можете видеть на этой картинке:
Есть идеи, в чем причина этого? а как исправить?
Это документированное изменение в PHP 7.2. Вам нужно либо обновить Laravel до версии 5.6, либо обновить PHP до версии 7.1.
/Поместите этот код в начало вашего файла маршрутов, он будет работать нормально /
if(version_compare(PHP_VERSION, '7.2.0', '>=')) {
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}
Я столкнулся с аналогичной проблемой в Laravel 5.6. Где я получал ошибку для массива, основанного на объектах. Я знал, что данные в этой конкретной переменной всегда будут оставаться объектом, поэтому я использовал для преобразования объекта в массив. Вот пример кода: $objectData = (array)$objectData; echo "Total Elements in array are: ".count($objectData);
$objectData = (array)$objectData; echo "Total Elements in array are: ".count($objectData);
Заменить
$originalWhereCount = count($query->wheres);
от
$originalWhereCount = count((array)$query->wheres);
в
\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php
поместите приведенную ниже строку ob code перед именем класса в ваших контроллерах
if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
// Ignores notices and reports all other kinds... and warnings
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
// error_reporting(E_ALL ^ E_WARNING); // Maybe this is enough
}
Откройте этот файл
\Поставщика\Laravel\рамки\SRC\Осветите\Database\красноречивый\Builder.php
Ищу:
count($query->wheres);
и измените это на:
count((array) $query->wheres);
Добавьте приведенный ниже код в ваш файл web.php
if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
}
Я разрешаю это в Laravel 5.6
//в контроллере
public function index()
{
$todos = Todo::all();
return view('todos.index')->with(['todos' => $todos]);
}
//на странице просмотра
@if(count($todos) > 0)
@foreach($todos as $todo)
<div class="well">
<h3>{{$todo->text}}</h3>
<span class="label label-danger">{{$todo->due}}</span>
</div>
@endforeach
@endif
У меня такая же проблема, когда я использую Laravel 5.2
, PHP 7.2
Я изменил строку ошибки 1185 в 'vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php' с помощью:
$originalWhereCount = is_array($query->wheres)? count($query->wheres): 0;
эта работа для меня