John Davidson

php - Laravel and Redmine Database // query builder with eloquent

0 comments
Message:


I'm new in Laravel (5.4). I work on redmine database and I want to have users role. The tables are :


users : id, login, hashed_password,...
members : id, user_id, project_id, created_on, mail_notification
member_roles : id, member_id (foreign key), role_id, inherited_from
roles : id, name,...

My query works perfectly but I want to make it fluent without "->select(...)" :


$membersRole = DB::connection('redmine')
->select('SELECT roles.name as role, user_id
FROM users, members, projects, member_roles, roles
WHERE projects.id = ?
AND members.user_id = ?
AND members.project_id = projects.id
AND members.id = member_roles.member_id
AND roles.id = member_roles.role_id
LIMIT 1', [$id, $userId]);

How can I do it ?



My Answer:
having to write raw SQL queries. Here's how you can achieve this using Laravel's Eloquent ORM and query builder:

First, define your models for the users, members, roles, and projects tables:

php
// User model
class User extends Model
{
protected $table = 'users';

public function members()
{
return $this->hasMany(Member::class, 'user_id');
}
}

// Member model
class Member extends Model
{
protected $table = 'members';

public function user()
{
return $this->belongsTo(User::class, 'user_id');
}

public function roles()
{
return $this->hasMany(MemberRole::class, 'member_id');
}
}

// Role model
class Role extends Model
{
protected $table = 'roles';

public function members()
{
return $this->hasMany(MemberRole::class, 'role_id');
}
}

// Project model
class Project extends Model
{
protected $table = 'projects';

public function members()
{
return $this->hasMany(Member::class, 'project_id');
}
}


Now, you can use Eloquent relationships to build your query:

php
$usersWithRoles = User::with(['members.roles.role'])->get();

foreach ($usersWithRoles as $user) {
foreach ($user->members as $member) {
foreach ($member->roles as $role) {
echo $user->login . ' has role ' . $role->role->name . ' in project ' . $member->project_id . '
';
}
}
}


This code will fetch all users along with their roles in each project they are a member of. You can further customize the query by adding conditions, eager loading, or other methods provided by Eloquent.

Rate this post

5 of 5 based on 7406 votes

Comments




© 2024 Hayatsk.info - Personal Blogs Platform. All Rights Reserved.
Create blog  |  Privacy Policy  |  Terms & Conditions  |  Contact Us