Laravel 5 UnexpectedValueException в ответ на запрос из-за использования данных POINT

Я хотел добавить поле POINT для широты и долготы в моем проекте, и я нашел этот учебник, который я имитировал, чтобы убедиться, что он работает, но я зациклился на том, почему эта ошибка происходит сейчас:

UnexpectedValueException in Response.php line 403: The Response content must be a string or object implementing __toString(), "boolean" given. 

Который, если я откажусь от изменений поля POINT, не возникает, и я получаю данные JSON, которые позволяют мне использовать Геокодирование Google Карт адреса вместо данных широты и долготы.

Действие конечной точки выглядит так, что работает только без данных POINT:

 public function rentals($id) { // Retrieve all rentals within a region and the locations spatial data $rentals = DB::table('rentals') ->join('regions', 'rentals.region_id', '=', 'regions.id') ->join('rental_locations', 'rentals.rental_location_id', '=', 'rental_locations.id') ->where('rentals.region_id', '=', $id) ->select('*') ->get(); // Create a collection from the array of query results $rentals = collect($rentals); // Group all rentals by location $rentals = $rentals->groupBy('rental_location_id'); $data = [ 'rentals' => $rentals ]; return response()->json([ 'data' => $data ]); } 

Аксессор и мутатор в основном совпадают с учебником, но я изменил имя поля местоположения на latitude_longitude:

 public function setLatitudeLongitudeAttribute($value) { $this->attributes[ 'latitude_longitude' ] = DB::raw("POINT($value)"); } public function getLatitudeLongitudeAttribute($value) { $location = substr($value, 6); $location = preg_replace('/[ ,]+/', ',', $location, 1); return substr($location, 0, -1); } 

Миграция в аренду

 public function up() { Schema::create('rental_locations', function (Blueprint $table) { $table->increments('id'); $table->string('street_address', 100); $table->string('city', 50); $table->string('province', 50); $table->string('country', 50); $table->string('postal_code', 10); $table->timestamps(); }); // Laravel's schema creation doesn't support geographic data - July 2015 Laravel version 5.1 DB::statement('ALTER TABLE rental_locations ADD latitude_longitude POINT'); } 

Семена для аренды

 protected $rentalLocations = [ [ 'street_address' => '707 Johnson St.', 'postal_code' => 'V8W 1M8', 'latitude_longitude' => '48.4271731,-123.3644049' ], ... ]; public function run() { // Rentals situated within available regions used during development foreach ($this->rentalLocations as $rentalLocation) { // Rental locations used during development factory(App\RentalLocation::class, 1)->create($rentalLocation); } } 

Фабрика для аренды

 $factory->define(Parkable\RentalLocation::class, function ($faker) { return [ 'street_address' => '', 'city' => 'Victoria', 'province' => 'British Columbia', 'country' => 'Canada', 'postal_code' => '', 'latitude_longitude' => '' ]; }); 

и я сделал latitude_longitude заполненным в модели RentalLocation.

Я попытался добавить все параметры в ответ, как это было предложено на форуме Laracasts, если это проблема UTF-8, но это ничего не изменило:

 return response()->json(['data' => $data], 200, [], JSON_UNESCAPED_UNICODE); 

Related of "Laravel 5 UnexpectedValueException в ответ на запрос из-за использования данных POINT"

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

 public function rentals($id) { // Retrieve all rentals within a region and the locations spatial data $rentals = DB::table('rentals') ->join('regions', 'rentals.region_id', '=', 'regions.id') ->join('rental_locations', 'rentals.rental_location_id', '=', 'rental_locations.id') ->select('*') ->where('rentals.region_id', '=', $id) ->groupBy('rental_location_id') ->get(); return collect($rentals); // or return $rentals /* Not necessary // Create a collection from the array of query results $rentals = collect($rentals); // Laravel is set up to return collections as json when directly returned return $rentals; */ } 

Поэтому вам нужно добавить groupBy в самом запросе, потому что это действие запроса, которое должен выполнять ваш SQL. Другая часть состоит в том, что когда вы конвертируете ее в коллекцию (которая не является 100% необходимой), вы можете просто вернуть ее. Laravel обрабатывает JSON изначально.