2016-07-31 14 views
1

Ich denke immer noch, gibt es eine Möglichkeit, wie kann ich einen benutzerdefinierten Pivot-Tabellennamen erstellen? Weil ich ein Dokumente und Benutzer Tabelle erstellt hat eine viele zu viele Beziehung mit document_user, die meine ist Pivot-Tabelle und diese Tabelle wurde für empfangene Dokument erstellt, die Benutzer erstellt. Und ich plane, eine andere Pivot-Tabelle für Dokument und Benutzer diese Tabelle wurde für gesendete Dokumente erstellt, so dass ich Geschichte haben kann. Siehe meinen Code unten.Kann ich einen benutzerdefinierten Pivot-Tabellennamen mit einem anderen M: M-Objekt erstellen?

create_document_user_table

public function up() 
{ 
    Schema::create('document_user',function (Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->integer('user_id')->unsigned(); 
     $table->integer('document_id')->unsigned(); 

     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
     $table->foreign('document_id')->references('id')->on('documents')->onDelete('cascade'); 

     $table->unsignedInteger('sender_id')->nullable(); 
     $table->foreign('sender_id')->references('id')->on('users')->onDelete('cascade'); 

     $table->dateTime('dateReceived')->default(DB::raw('CURRENT_TIMESTAMP')); 
     $table->timestamp('dateModified')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); 
    }); 
} 

documents_table

public function up() 
{ 
    Schema::create('documents', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('title'); 
     $table->text('content'); 
     $table->integer('category_id')->unsigned(); 
     $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); 
     $table->timestamps(); 
    }); 
} 

users_table

public function up() 
{ 
    Schema::create('users', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('first_name'); 
     $table->string('last_name'); 
     $table->string('middle_name'); 
     $table->string('email'); 
     $table->string('username'); 
     $table->string('address'); 
     $table->string('password'); 
     $table->string('remember_token'); 

     $table->integer('role_permission_id')->unsigned(); 

     $table->foreign('role_permission_id')->references('id')->on('roles_permissions_dt')->onDelete('cascade'); 
     $table->timestamps(); 
    }); 
} 

Dies funktioniert gut, Datensätze in meine Pivot-Tabelle einzufügen. Was ich plane zu erreichen, ist jedes Mal, wenn ich einen Datensatz für Dokumente eingefügt dies wird auch in meinem benutzerdefinierten Pivot-Tabelle nicht nur in meinem document_user Pivot-Tabelle eingefügt. Jede Hilfe würde geschätzt werden! Danke für deine Infos oder Tipps.

UPDATE

@Mina Dank für die Tipps, die Ihnen gegeben, aber eigentlich ist mein Einsatz oder für meine Pivot-Tabelle speichern. Wie kann ich das in meine Revisions-Tabelle einfügen?

Document

public function postDocuments(Request $request) 
{ 

    $this->validate($request, 
    [ 
     'title' => 'required|regex:/(^[A-Za-z0-9 ]+$)+/|max:255', 
     'content' => 'required', 
     'category_id' => 'required', 
     'recipient_id' => 'required', 
    ]);  


    $document = new Document(); 
           //Request in the form 
    $document->title = $request->title; 
    $document->content = $request->content; 
    $document->category_id = $request->category_id; 

    $document->save(); 
    $user = Auth::user(); 

    foreach($request->recipient_id as $recipientId) 
    { 
     $document->recipients()->sync([ $recipientId => ['sender_id' => $user->id]],false); 
    } 

    return redirect()->back(); 
} 
+0

warum eine andere Pivot-Tabelle, es ist eine Beziehung zu dem Dokument direkt. –

+0

@MinaAbadir Weil, was ich getan habe, brauche ich eine Geschichte von erstellten und empfangenen Dokumenten für jeden Benutzer. Deshalb habe ich eine M: M-Beziehung erstellt. – Francisunoxx

+0

Kann ein Dokument von vielen Benutzern erstellt werden? –

Antwort

0

Sie brauchen nicht eine andere Pivot-Tabelle. Sie benötigen einen Tisch wie folgt aus:

public function up() 
{ 
    Schema::create('revisions', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('document_id')->unsigned(); 
     //Rest of table structure 

     $table->foreign('document_id')->references('id')->on('document_user')->onDelete('cascade'); 
     $table->timestamps(); 
    }); 
} 

Wenn Sie eine neue Version erstellen müssen:

$document = new Document; 
//add $document attributes 
$user->documents()->save($document); 

$document->recipients->each(function($recipient){ 
     $id = $recipient->pivot->id; 
     Revision::create(['document_id'=>$id]); 
}) 
+0

Danke für diese Lösung! Ist 'Revision' mein Modell? Habe ich recht? Was ist, wenn ich bereits Werte in meinen 'document_user' eingefügt habe, wie kann ich diesen in meine 1: M einfügen? – Francisunoxx

+0

use Revision ist ein Modell tut mir leid, es nicht zu erwähnen. Sie können es wie erwähnt einfügen. Holen Sie sich die neue Datensatz-ID über eine find-Anweisung für die Sammlung und die ID mit dem Pivot-Attribut. Ich werde weitere Erläuterungen hinzufügen. –

+0

Überprüfen Sie die aktualisierte Antwort jetzt. –

0

Sie können Ihre Pivot-Tabellen aufrufen, wie Sie möchten.

Wie bereits erwähnt, der Tabellenname der Beziehung der Verbindungstabelle, um zu bestimmen, wird Eloquent die beide verwandtes Modell Namen in alphabetischer Reihenfolge zu verbinden. Sie können diese Konvention jedoch überschreiben.Sie können dies tun, ein zweites Argument an die belongsToMany Methode, indem man:

return $this->belongsToMany('App\Role', 'user_roles');

(Eloquent: Relationships #Many To Many)

In Ihrem Fall müssen Sie die Beziehungen wie folgt definieren:

class User extends Model 
{ 
    // other stuff 

    createdDocuments() 
    { 
     return $this->belongsToMany('App\Document', 'document_user_created'); 
    } 

    sentDocuments() // or receivedDocuments() 
    { 
     return $this->belongsToMany('App\Document', 'document_user_sent'); 
    } 

    // other stuff 
} 


class Document extends Model 
{ 
    // other stuff 

    createdByUsers() 
    { 
     return $this->belongsToMany('App\User', 'document_user_created'); 
    } 

    sentToUsers() // or sentFromUsers() or whatever it does mean 
    { 
     return $this->belongsToMany('App\User', 'document_user_sent'); 
    } 

    // other stuff 
} 
+0

Ich denke, das wird nicht im zweiten Argument arbeiten, weil es den Regeln folgt. Habe das schon probiert aber ich kann einfügen. – Francisunoxx

+0

Was genau funktioniert nicht? Was hast du versucht einzufügen? –

+0

Was ich meine, wenn ich nicht den Regeln von Laravel folge. Ich kann die Werte einfach nicht in meine Pivot-Tabelle einfügen. – Francisunoxx