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 Maps вместо данных широты и долготы.

Действие конечной точки выглядит следующим образом, оно работает только без данных 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
    ]);
}

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

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);

person mtpultz    schedule 15.07.2015    source источник
comment
что находится в строке 403 в Response.php, добавьте к вашему вопросу, пожалуйста... функцию, которая возвращает предпочтительно: D   -  person Cayce K    schedule 15.07.2015
comment
@mtpultz ты придумал решение для этого? Я также застрял на этом. Когда я добавляю таблицу с точечным пространственным ключом для соединения, я получаю эту ошибку. Любое предложение?   -  person Sadee    schedule 23.06.2016
comment
Привет @Sadee, я не смог решить эту проблему. В итоге я просто использовал геокодирование Google Maps вместо широты и долготы. Это было очень неприятно.   -  person mtpultz    schedule 25.07.2016


Ответы (1)


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

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.

person Cayce K    schedule 15.07.2015
comment
@mtpultz Я проверил учебник, поэтому я не знаю, в какой именно части этого вы пытаетесь использовать точку или как это связано с этим, но то, что я даю, должно сработать, дайте мне знать !! - person Cayce K; 15.07.2015
comment
Привет, похоже, выдает ту же ошибку. Я взял реализацию как есть, за исключением изменения имени поля и не использовал действие scopeDistance. По сути, я хотел использовать данные POINT, а мутатор и метод доступа обрабатывали форматирование. Поэтому я передаю lat и long как «lat,long», и он преобразуется в POINT и наоборот. Если я отменю только то поле, которое я пытаюсь добавить, все работает. - person mtpultz; 15.07.2015
comment
Можете ли вы рассказать мне больше о том, какая часть возвращает ошибку? мы на 100% уверены, что функция аренды возвращает логическое значение? - person Cayce K; 15.07.2015
comment
также можете ли вы проверить, какую версию mysql вы используете? - person Cayce K; 15.07.2015
comment
Используя MySQL 5.6.19, который поставляется с Homestead 2. Я делаю один вызов RESTful на мой RentalController@rentals, чтобы получить все данные об аренде в регионе, а также данные о местоположении этой аренды. До добавления этого руководства в мою модель она возвращала правильную информацию, и мне приходилось использовать геокодер Google, чтобы получить положение через переданную обратно адресную информацию, но вместо этого я хотел использовать широту и долготу в качестве данных POINT, поскольку я могу сделать Google маркер карты без использования геокодера. Теперь точно такое же действие возвращает эту ошибку. - person mtpultz; 15.07.2015
comment
Это ошибка, возникающая в объекте Response Laravel, если $content не является строкой, числом или массивом, который можно преобразовать в строку. - person mtpultz; 15.07.2015
comment
Давайте продолжим обсуждение в чате. - person Cayce K; 15.07.2015
comment
@mtpultz, так что .. Я только что столкнулся с этим сегодня ... Я не уверен, почему я получаю истинный ответ на свой запрос, но теперь я знаю. Так что я могу получить json из dd($array) или просто передать его в представление и использовать. Я до сих пор не уверен, почему это происходит. Жаль, что я не мог понять это .. так странно. - person Cayce K; 16.07.2015