Relationships

This is the official documentation of the forestadmin/laravel-forestadmin v2+ and forestadmin/symfony-forestadmin PHP agents.

When relationships are defined during the customization step, Forest Admin Collections act as if the 2 Collections were natively linked at the data source level.

You may have noticed that relationships within a data source are configured out of the box, so you won't need to define those.

However, you may want to create additional intra and cross data source relationships to:

  • help users navigate within your admin panel,

  • create charts that use data from multiple data sources,

  • let users filter, use scopes, or segment with conditions that cross data source boundaries.

Minimal example

use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\SymfonyForestAdmin\Service\ForestAgent;

$forestAgent->customizeCollection(
    'Town',
    function (CollectionCustomizer $builder) {
        $builder
            // Towns belong to 1 country
            ->addManyToOneRelation(
                name: 'country',
                foreignCollection: 'Country',
                foreignKey: 'country_id'
            )

            // Towns have 1 mayor
            ->addOneToOneRelation(
                name: 'myMayor',
                foreignCollection: 'Mayor',
                originKey: 'town_id'
            )

            // Towns have multiple inhabitants
            ->addOneToManyRelation(
                name: 'inhabitants',
                foreignCollection: 'Person',
                originKey: 'town_id'
            )

            // Towns electricity is supplied by power-plants which are shared with other towns.
            ->addManyToManyRelation(
                name: 'energyProviders',
                foreignCollection: 'PowerPlant',
                throughCollection: 'UtilityContract',
                originKey: 'town_id',
                foreignKey: 'power_plant_id'
            );

            ->addExternalRelation(
                'honoraryCitizen',
                [
                    'schema' => ['firstName' => 'String', 'lastName' => 'String'],
                    'listRecords' => function ($record) {
                        $client = new \GuzzleHttp\Client();
                        $response = $client->get('https://api.example.com/user/' . $record['id']);
                        return $response->getBody();
                    }
                ]
            )
    }
);

Last updated