• 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Relations Module

#1
Hi all! The compliment to my Schemas module, Relations provides very basic relationship loading. This is *not* a fully-featured ORM nor does it ever intend to be, but it does provide basic eager loading for related items (entity lazy loading coming with a future release).

Tatter/Relations - Entity relationships for CodeIgniter 4

Basic usage:

  1. Install with Composer: `> composer require tatter/relations`
  2. Extend the model: `class UserModel extends \Tatter\Relations\Model`
  3. Load relations: `$users = $userModel->with('groups')->findAll();`
Your models extend Tatter\Relations\Model which injects related items that you define into the returned rows. Related items can be requested by adding a $with property to your model:

PHP Code:
protected $with 'groups';
// or
protected $with = ['groups''permissions']; 

... or by requesting it on-the-fly using the new with() method:

PHP Code:
$users $userModel->with('groups')->findAll();
foreach (
$users as $userEntity)
{
echo 
"User {$user->name} has " count($user->groups) . " groups.";
... 

(As you can see the related items are added directly to their corresponding object or array returned from the primary model.)

Relations relies on the Schemas module to map the database and detect related tables and their relationship. (You may also provide explicit relationships using the Schemas File Handler). Schemas will also attempt to associate your database tables back to their models and Relations will use each table's model to find the related items. This keeps consistent the return types, events, and other aspects of your models. In addition to the return type, Relations will also adjust related items for singleton relationships:

PHP Code:
// User hasMany Widgets
$user $userModel->with('widgets')->find($userId);
echo 
"User {$user->name} has " count($user->widgets) . " widgets.";

// ... but a Widget belongsTo one User
$widget $widgetModel->with('users')->find($widgetId);
echo 
$widget->name " belongs to " $widget->user->name


Thanks for reading! I'm always glad for feedback and suggestions, feel free to leave a comment here or check out the repo at https://github.com/tattersoftware/codeig...-relations.
Reply

#2
Huge update to the Relations module and its partner-in-crime, Schemas. The new versions have a lot better performance optimization, and make it easier for developers to use by moving methods to traits (so you can extend whatever other Models you like!). Also, probably the most exciting: entities are now supported. Simply add the trait to your entity and now you can lazy-load related items on-the-fly as properties:
PHP Code:
    $user $userModel->find(1);
    
    foreach (
$user->groups as $group)
    {
        echo 
$group->name;
    } 

The entity trait also comes with magic methods to make it easy to check and update related items:
PHP Code:
    $user->addGroup(3);
    
$user->removeGroups([12]);    
    
$user->setGroups([5]); 
Check it out on Packagist or GitHub and share any feedback you have. Thanks for reading!
Reply

#3
I'm trying to use this and I got timed out every time.

There's any fully functional examples?
Reply

#4
Can you provide more details and some code samples? Most likely you’re timing out on the schema generation, which ideally should be happening ahead of time (e.g. cron) via the CLI. Try running “php spark schema” and let it generate and cache a schema and then load your pages again.
I’m using this on a few projects very successfully but unfortunately they are for private clients. I will see if I can get an example project going. You can also check out the tests, and run them with “composer test” from a cloned repo.

Also: OS, PHP version, web server, etc would help.
Reply


Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


  Theme © 2014 iAndrew  
Powered By MyBB, © 2002-2019 MyBB Group.