Lluís Puig Ferrer
Lluís Puig Ferrer

Reputation: 1146

How should make this relationship and access data in Laravel

I have 4 tables:

Table name: clients

Fields: id, name, slug

Table name: projects

Fields: id, slug

Table name: project_translation

Fields: id, locale, project_id, title

Table name: client_project

Fields: id, client_id, project_id

Relationships

In the Project model

public function clients()
    {
        return $this->belongsToMany(Client::class,'client_project')->withTimestamps();
        //return $this->belongsToMany('Client')->withTimestamps()->orderBy('priority', 'desc');
    }

In the Client model

public function projects()
    {
        return $this->belongsToMany(Project::class,'client_project')->withTimestamps();
    }
    public function translate()
    {
        return $this->belongsToMany(ProjectTranslation::class,'project_translations')->withTimestamps();
    }

In Client_Project model

public function clients()
    {
        return $this->hasMany('App\Models\Project');
    }
    public function projects()
    {
        return $this->hasOne('App\Models\Client');
    }   

In ProjectTranslation model

public function client()
    {
        return $this->hasMany('App\Models\Client');

    }

And I'm trying to access data in controller like this:

$client_project = Client::find($id)->translate;
        return $client_project;

This give me the next error:

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique 
table/alias: 'project_translations' (SQL: select 
`project_translations`.*, `project_translations`.`client_id` as 
`pivot_client_id`, `project_translations`.`project_translation_id` as 
`pivot_project_translation_id`, `project_translations`.`created_at` as 
`pivot_created_at`, `project_translations`.`updated_at` as 
`pivot_updated_at` from `project_translations` inner join 
`project_translations` on `project_translations`.`id` = 
`project_translations`.`project_translation_id` where `project_translations`.`client_id` = 22)

I'm not sure, but I think something is wrong with Relationships.

I'm in Client blade, and I want to show the projectstranslations of the projects of this client.

Upvotes: 1

Views: 120

Answers (2)

Maraboc
Maraboc

Reputation: 11083

you don't need Client_Project model.

In the Project model

public function clients()
{
    return $this->belongsToMany(Client::class,'client_project')->withTimestamps();
}

public function translates()
{
    return $this->hasMany(ProjectTranslation::class);
}

In the Client model :

public function projects()
{
    return $this->belongsToMany(Project::class,'client_project')->withTimestamps();
}

In the ProjectTranslation model :

public function project()
{
    return $this->belongsTo('App\Models\Project');
}

In the controller :

$client_projects = Client::find($id)->projects; //all client projects
return $client_projects;

In the view after geting this $client_projects and looping over it you can get the translations of a project by :

$client_project->translates  // for single projects you will get its translates :)

For Project you have many to many with clients and it has one to many translates => in the documentation links there are many examples :)

Upvotes: 1

ArtisticPhoenix
ArtisticPhoenix

Reputation: 21671

Here I formatted you query so it's readable, as I said in the comments I am not a laravel user. But I know Sql

select 
    `project_translations`.*,
    `project_translations`.`client_id` as `pivot_client_id`,
    `project_translations`.`project_translation_id` as `pivot_project_translation_id`,
    `project_translations`.`created_at` as `pivot_created_at`,
    `project_translations`.`updated_at` as `pivot_updated_at`
from 
    `project_translations`  <-- Duplicate Table with no alias
inner join 
    `project_translations` on `project_translations`.`id` = `project_translations`.`project_translation_id`
where
    `project_translations`.`client_id` = 22

Upvotes: 1

Related Questions