Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel eloquent table-less data from external source

I'm developing an application where my data comes from external server in JSON format.

I would like to set a relationships between each models, but without using a database table.

Is it possible ?

Something like that:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'https://.../server/flights.json';
}
like image 926
aspirinemaga Avatar asked Mar 26 '26 21:03

aspirinemaga


1 Answers

You could make a service class which handles the request and returns class instances:

namespace App\Services;

class FlightService
{
    /**
    * @var FlightFactory
    */
    private $flightFactory;

    public function __construct(FlightFactory $flightFactory)
    {
        $this->flightFactory = $flightFactory;
    }

    public function getAllFlights()
    {
        $flightsJson = $this->getFromExternalCurl();
        return $this->flightFactory->buildFlightList($flightsJson);
    }

    private function getFromExternalCurl()
    {
        return Curl::to('http://www.foo.com/flights.json')
        ->withData( array( 'foz' => 'baz' ) )
        ->asJson()
        ->get();
    }

}

Basically the service would make the external API call and the response is passed to a factory which creates the instances.

Note that you just need to add the factory in the construct and it's binded because laravel uses https://laravel.com/docs/5.4/container

namespace App\Factories;

class FlightFactory
{
    public function buildFlightList($flightJsonList)
    {
        $flightCollection = collect();
        foreach($flightJsonList as $flightJson) {
            $flightCollection->push($this->buildFlight($flightJson));
        }
        return $flightCollection;
    }

    public function buildFlight($flightJson)
    {
        $flight = new Flight();
        // add properties
        return $flight;
    }

}

The factory will return a Collection which is verry usefull because it contains usefull methods, or you can return an array.

In this example I used a curl library https://github.com/ixudra/curl but it can be replaced with native php or other libraries.

Then you can use by injecting the FlightService in your controllers.

P.S: Code not tested but represents a possible approach

like image 77
ka_lin Avatar answered Mar 29 '26 09:03

ka_lin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!