Как сделать обновление в laravel, используя foreach l oop с помощью querybuilder - PullRequest
0 голосов
/ 14 января 2020

У меня есть таблица с именем schools и там есть столбец lat и long Я определил ее как пустую, потому что я хочу, чтобы она позже заполнилась координатами, используя геокод Google. Теперь, когда я уже настроил свой API для геокодирования Google и получил координаты. Я хочу обновить столбец lat и long в моей базе данных, используя geocode api и querybuilder. Я использовал запрос foreach, но когда я делаю dd, он печатает последние данные. Может кто-нибудь сказать мне, что я должен обновить их все? спасибо.

Структура БД

+---------------------------------------------+---------------------------+-------------+-----+-----+
| school_name                                 | address                   | postal_code | lat | lng |
+---------------------------------------------+---------------------------+-------------+-----+-----+
| NGEE ANN SECONDARY SCHOOL                   | 1 TAMPINES STREET 32      | 529283      |     |     |
| SINGAPORE SPORTS SCHOOL                     | 1 CHAMPIONS WAY           | 737913      |     |     |
| NUS HIGH SCHOOL OF MATHEMATICS AND SCIENCE  | 20 CLEMENTI AVENUE 1      | 129957      |     |     |
| SCHOOL OF THE ARTS, SINGAPORE               | 1 ZUBIR SAID DRIVE        | 227968      |     |     |
| NORTHLIGHT SCHOOL                           | 151 TOWNER ROAD           | 327830      |     |     |
| ASSUMPTION PATHWAY SCHOOL                   | 30 CASHEW ROAD            | 679697      |     |     |
| SCHOOL OF SCIENCE AND TECHNOLOGY, SINGAPORE | 1 TECHNOLOGY DRIVE        | 138572      |     |     |
| CREST SECONDARY SCHOOL                      | 561 JURONG EAST STREET 24 | 609561      |     |     |
| SPECTRA SECONDARY SCHOOL                    | 1 WOODLANDS DRIVE 64      | 737758      |     |     |
+---------------------------------------------+---------------------------+-------------+-----+-----+

Вот мой код

  public function geocode(){
        ini_set('max_execution_time', 0);
        $client = new \GuzzleHttp\Client();
        $geocoder = new Geocoder($client);
        $geocoder->setApiKey(config('geocoder.key'));
        $postals = \DB::table('schools')
                        ->select('postal_code')
                        ->get();        
        foreach ($postals as $postal){
            $address = $geocoder->getCoordinatesForAddress($postal->postal_code);
        }
        dd($address);
    }

В ответ я получил

  "lat" => 1.4364557
  "lng" => 103.8043789
  "accuracy" => "ROOFTOP"
  "formatted_address" => "1 Woodlands Drive 64, Singapore 737758"
  "viewport" => {#609 ▶}
  "address_components" => array:6 [▶]
  "place_id" => "ChIJTXT5XbwR2jERbkmADGYcJ4U"
]

Ответ из последних данных, которые имеют почтовый индекс 737758

Ответы [ 3 ]

2 голосов
/ 14 января 2020

dd() возвращает последние данные, поскольку вы устанавливаете значение для адреса в каждом l oop, по последнему адресу возвращается последнее значение.

Если вы хотите обновить его, вы можете сделать это следующим образом это:

        foreach ($postals as $postal){
            $address = $geocoder->getCoordinatesForAddress($postal->postal_code);
            DB::table('schools')
                    ->where('postal', $postal->postal_code)
                    ->update(['lat' => $address['lat'], 'lng' => $address['lng']]);
        }
1 голос
/ 14 января 2020

Ну, вы знаете почтовый индекс, по которому вы запросили адрес, и у вас есть соответствующие значения широты / долготы.

Теперь вы должны извлечь значения из ответа и построить текст запроса ОБНОВЛЕНИЕ. Для показанного ответа это

UPDATE schoools
SET  lat = 1.4364557        /* $address->lat */
   , lng = 103.8043789      /* $address->lng */
WHERE postal_code = 737758; /* $postal->postal_code */

Тогда вы должны выполнить его. Сделайте это в том же цикле foreach ($postals as $postal) для каждого почтового индекса.

Вы также можете обновить поле address (или вставить поле formatted_address и обновить его).

1 голос
/ 14 января 2020

Объявите переменную $address как массив и попробуйте

foreach ($postals as $postal){
    $address[] = $geocoder->getCoordinatesForAddress($postal->postal_code);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...