Building GraphQL APIs with Laravel, PostgreSQL and Hasura Remote Joins
This articles was written by Chimezie Enyinnaya as part of the Hasura Technical Writer Program. If you would like to publish an article about Hasura or GraphQL on our blog, apply here.
Remote Joins in Hasura extend the concept of joining data across tables, to being able to join data across tables and remote data sources. Once you create relationships between types from your database and types created from APIs, you can then “join” them by running GraphQL queries.
Remote joins can join across the database and APIs. These APIs can be custom GraphQL servers you write, 3rd party SaaS APIs, or even other Hasura instances.
In this article, we will be building APIs in Laravel using PostgreSQL as a database and Hasura for query and Remote Joining multiple tables in the database.
Prerequisites
Knowledge of Laravel
Basic knowledge of PostgreSQL and GraphQL
Setting up
To start, we will need to install Laravel on our computer and set it up. Open your command line and type in the below command:
bash
composer create-project laravel/laravel hasura-graphql
cd hasura-graphql
php artisan serve
Next, we set up an online PostgreSQL database. I will be using ElephantSQL for my database. You can use other online PostgreSQL databases if you would like.
After setting up our ElephantSQL account and creating your database, we will then set up a Hasura.io account and create a new project. If you are new to Hasura, you can learn how to set up a new project here.
Then we proceed to database setup, copy your PostgreSQL database URL and paste in the Enter your database URL input.
Note: the URL starts with postgres:// so look out for a URL like that in your online PostgreSQL platform.
Go to your database and create a todos table and populate it with some data.
With that done, we are ready to test our database. We go back to our project and configure our .env file to add our database configuration.
After the configuration is complete, we need to install lighthouse php to use GraphQL in our Laravel application. Lighthouse is a framework for serving QueryQL on Laravel. To install use the below code:
Then we can open it using http://127.0.0.1:8000/graphql-playground. But before that, we need to configure our Lighthouse and create a Todo Model. We do that using the below command:
bash
php artisan make:model Todo
This will create a new model in your app/Modelsdirectory. Configure it with the code:
php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Todo extends Model
{
use HasFactory;
protected $table = 'todos';
protected $primaryKey = 'id';
protected $fillable = ['title', 'short_description', 'content'];
}
Then, in our graphql/schema.graphql file we can add the schema for the Todo type as well as a couple of GraphQL queries:
type Query {
todos: [Todo!]! @all
todo(id: ID @eq): Todo @find
}
type Todo {
id: ID!
title: String!
short_description: String!
content: String!
created_at: DateTime!
updated_at: DateTime!
}
With that done, we can open our Graphql-playground and test out our database using http://127.0.0.1:8000/graphql-playground
Remote Joins
Now we are done with setting up, we need to create our remote joins, to do this we will be
Modifying our todo table and added users table
creating a relationship between the users table and todo table (manually populating data)
Testing out our remote joins
To modify the database, go to your Hasura console and create a new Users table
Then create a relationship between todos table and users table. To do that, follow the instruction here. Once the relationship is created between todos and users, we can then test on our Hasura console.
As the above code shows, we have joined our todos table to our users table and we are fetching all todos with their corresponding user.
Conclusion
In this tutorial, we have
Created a new instance of Laravel
Installed and used Lighthouse and GraphQL playground for our GraphQL query
We then created our ElephantSQl database and tied it to our Hasura account.
Configured our Laravel application to interact with our ElephantSQL and then created a remote join for our todos and users table.
You should now understand the basics of building Laravel APIs with PostgreSQL and Hasura Remote Joins.
This articles was written by Chimezie Enyinnaya as part of the Hasura Technical Writer Program. If you would like to publish an article about Hasura or GraphQL on our blog, apply here.
About the Author
Chimezie Enyinnaya is a software developer and content creator based in Lagos, Nigeria. He is the founder of adonismastery.com where he teaches about AdonisJS, a fully-featured Node.js framework.