2015-12-12 58 views
0

我是Laravel 5的初學者,我試着開發一個博客,假設我有一個Article模型,它與Tag模型有許多關係。如何根據數據透視表中的屬性來統計數據量?

這是文章的模型:

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Article extends Model { 

    protected $fillable = [ 
     'name', 
     'description' 
    ]; 

    public function tags() { 
     return $this->belongsToMany('App\Tag')->withTimestamps(); 
    } 

} 

這是標籤型號:

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Tag extends Model { 

    public function articles() { 
     return $this->belongsToMany('App\Article')->withTimestamps(); 
    } 

} 

下面是文章表遷移和Article_Tag透視表:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateArticlesTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('articles', function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->string('name')->unique(); 
      $table->text('description'); 
      $table->timestamps(); 
     }); 

     Schema::create('article_tag', function(Blueprint $table) 
     { 
      $table->integer('article_id')->unsigned()->index(); 
      $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); 

      $table->integer('tag_id')->unsigned()->index(); 
      $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); 

      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('article_tag'); 
     Schema::drop('articles'); 
    } 

} 

這是標籤表的遷移:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateTagsTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('tags', function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->string('name')->unique(); 
      $table->integer('count')->unsigned(); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('tags'); 
    } 

} 

可以說,我有3個標籤在我的數據庫中,「生活方式」,「社會」,「經濟」。

假設一篇文章是用標籤「生活方式」創建的,然後在ArticleController中,在商店功能中,我希望將「生活方式」標籤的count屬性設置爲數據庫中文章的數量在這種情況下,它將從數據透視表中計數),使用count()函數生成具有「生活方式」標籤的數據。

如果TAG_ID是在文章表,我可以做這樣的控制器:

$article = new Article($request->all()); 
$article->save(); 

foreach($article->tags as $tag) { 
    $tag->count = Article::where('tag_id', $request->tag_id)->count(); 
    $tag->save(); 
} 

但在這種情況下,其中的功能推遲到透視表中的一列,我有不知道該怎麼做。

我的初學者的錯誤的任何解決方案?提前致謝。

回答

0

您可以輕鬆地通過調用計數屬於特定標記的文章:

$tag->count = $tag->articles()->count(); 
$tag->save(); 

以上將運行2個SQL查詢 - 一個做計數和一個更新的標籤。您也可以嘗試以下,會做一個查詢:

Tag::whereId($tag->id)->increment('count'); 

這將運行一個SQL UPDATE查詢:

UPDATE `tags` SET `count` = `count` + 1 WHERE `id` = {$tag->id} 
+0

哇,它的工作。從來沒有想過這麼簡單。謝謝你,你做了我的一天。 :d – Fernando

相關問題