2016-04-01 13 views
0

Ich habe die folgende Tabellenstruktur, welche Benutzer einen Kommentar senden können, oder eine Antwort auf einen Kommentar:Laravel Fremdschlüssel zur aktuellen Tabelle

Schema::create('comments', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('user_id')->unsigned()->nullable(); 
      $table->integer('model_id')->unsigned(); 
      $table->integer('parent_comment_id')->unsigned(); 
      $table->text('comment'); 
      $table->timestamps(); 

      $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); 
      $table->foreign('model_id')->references('id')->on('models')->onDelete('cascade'); 
      $table->foreign('parent_comment_id')->references('id')->on('comments')->onDelete('cascade'); 

     }); 

ich ein Fremdschlüssel parent_comment_id haben, die auf die comments Tabelle zurückweist . Dies zeigt, dass der Kommentar (obwohl er noch ein Kommentarobjekt ist) zu einem übergeordneten Kommentar gehört.

Wie wird diese Beziehung innerhalb des Modells für die Kommentartabelle (/App/Comment.php) definiert?

Antwort

1

Sie können so etwas wie dies versuchen (In App\Comment Modell):

public function replies() 
{ 
    return $this->childComments()->with('replies'); 
} 

public function childComments() 
{ 
    return $this->hasMany(Comment::class, 'parent_comment_id', 'id'); 
} 

So können Sie Comment::with('replies') verwenden alle zugehörigen Antworten rekursiv zu laden. Sie können aufgrund zweier für die Beziehung verwendeter Funktionen verwirrt werden, da eine Antwort möglicherweise eigene Antworten enthält, so dass Sie eine rezessive Beziehung benötigen. Also, replies() lädt alle Antworten mit eigenen Antworten. Sie können auch überprüfen, this post of mine, dass ich vor ein paar Jahren für Laravel - 4 geschrieben habe, aber die Idee ist gleich.

// Another example could be something like this 
$post = Post::with('comments.replies')->find(1); // Get Post with all comments with replies 

Anmerkung: In diesem Fall muss das Modell ein Postcomments() (hasMany) relationship Verfahren enthält.

0

Sie können etwas tun:

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Comment extends Model 
{ 
    public function parentComment() 
    { 
     return $this->hasOne('App\Comment'); 
    } 
} 

Sie können weitere Informationen in this doc-Seite.

Verwandte Themen