Laravel - Как сохранить конечную точку API в базу данных

У меня есть эта конечная точка, которая отображается. Но у меня есть конечная точка API, которую я хочу сохранить в базе данных.

     public function apifeed(Request $request)
    {
        $array_content=[];
        
         $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "http://api.company.com/article/6spf2p?_fmt=xml&_rt=b&_fld=hl,img,bd&lnk=urn:perform:image&_lcl=en");
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Important
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
            $result = curl_exec($ch);
           
             //$array = json_decode($result, true);
            
            if (curl_errno($ch)) {
                echo 'Error:' . curl_error($ch);
            }
              curl_close ($ch);
            $plainXML = self::mungXML($result);
        $arrayResult = json_decode(json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        $i=0;
        foreach($arrayResult['article'] as $value)
        {
        $newobj = new stdClass();
        $newobj->id = $value['@attributes']['id'];
        $newobj->headline = $value['headline'];
        $newobj->body = $value['body'];
        $newobj->image_header ='https://images.performgroup.com'.
        $value['links']['link'][0]['@attributes']['url'];
        $newobj->image_teaser ='https://images.performgroup.com'.
        $value['links']['link'][1]['@attributes']['url'];
        $newobj->image_mobile ='https://images.performgroup.com'.
        $value['links']['link'][2]['@attributes']['url'];
        $newobj->image_source = 'https://images.performgroup.com'.
        
        array_push($array_content,$newobj);
        
        $i++;
        }
        return $array_content;
    }  

Я хочу сохранить его в этой таблице

news_feeds

CREATE TABLE `news_feeds` (
  `id` varchar(80) NOT NULL,
  `headline` varchar(255) NOT NULL,
  `news_body` text NOT NULL,
  `image_teaser` varchar(300) NOT NULL,
  `image_mobile` varchar(300) NOT NULL,
  `image_source` varchar(300) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Модель NewsFeed

Как написать оператор foreach после

return $array_content

и сохранить в таблицу

news_feeds

$newobj->id into id

$newobj->id into headline

$newobj->body into news body

$newobj->image_teaser into image_teaser

и так далее.

На какой модели вы хотите сохранить данные

ashok poudel 06.06.2019 18:03

Вы действительно близки. $newobj = новая новостная лента(); затем вы назначаете идентификатор, заголовок, тело и другие поля так же, как вы их записали. Наконец, вызовите $newobj->save(); . Есть много лучших практик, которые вы должны рассмотреть, чтобы внедрить это в производство, но выполняет свою работу. Взгляните на laravel.com/docs/5.8/eloquent#inserts

j.steelman 06.06.2019 18:03

имя модели — NewsFeed, а имя таблицы — новостные ленты. Я помещаю столбцы в код

user11352561 06.06.2019 18:04

Затем, если заголовок существует, он не должен сохраняться. Он должен делать что угодно

user11352561 06.06.2019 18:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно создавать stdClass или добавлять зацикленные данные в новый массив для сохранения записей. Вы можете сохранять записи, используя модели laravel eloquent.

После вызова curl вы можете использовать класс модели NewsFeed и метод ::create() для создания новой записи newsfeed:

foreach($arrayResult['article'] as $value)
{
    if (NewsFeed::where('headline', $value['headline'])->exists()) {
        continue;
    }

    NewsFeed::create([
        'id'           => $value['@attributes']['id'],
        'headline'     => $value['headline'],
        'body'         => $value['body'],
        'image_header' => 'https://images.performgroup.com'.$value['links']['link'][0]['@attributes']['url'],
        'image_teaser' => 'https://images.performgroup.com'.$value['links']['link'][1]['@attributes']['url'],
        'image_mobile' => 'https://images.performgroup.com'.$value['links']['link'][2]['@attributes']['url'],
        'image_source' => 'https://images.performgroup.com'
    ]);
}

Здесь мы сначала проверяем, существует ли newsfeed, проверяя, есть ли какие-либо с тем же headline, который мы пытаемся сохранить. Если он существует, мы пропускаем его.

Если newsfeed с headline не существует, мы используем метод ::create() для создания нового NewsFeed. Это должно создать новую запись.

Примечание: Ваша ссылка image_source не заполнена.

Кроме того, чтобы очистить свой код (виновником является curl), вы можете использовать такие пакеты, как guzzle или zttp.

thisiskelvin 06.06.2019 18:20

Другие вопросы по теме