从使用数据透视表连接的2个表中获取数据(Laravel 5.3)

时间:2016-11-18 08:39:51

标签: laravel laravel-5

如何从使用数据透视表连接的2个表中获取数据?例如,在我的情况下,我使用数据透视表(penulis表)将用户表连接到日记表。现在我想获得属于特定用户的期刊数据。我试过这个:

$journal_list = DB::table('journal')->where('id_user', '=','id_journal')->orderBy('id', 'desc')->paginate(20);

上面的代码不起作用。以下是我的迁移:

用户表:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('username')->unique();
            $table->string('userslug');
            $table->string('nameslug');
            $table->string('email')->unique();
            $table->string('phone')->nullable();
            $table->string('address')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->enum('level', ['admin', 'author']);
            $table->timestamps();
        });
    }

期刊表:

public function up() {
        Schema::create('journal', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title', 255);
            $table->text('abstract');
            $table->text('file');
            $table->integer('id_edition')->unsigned();
            $table->string('journalslug');
            $table->timestamps();
        });
    }

Penulis表(数据透视表)

public function up()
    {
        Schema::create('penulis', function (Blueprint $table) {
            // Create tabel penulis
            $table->integer('id_user')->unsigned()->index();
            $table->integer('id_journal')->unsigned()->index();
            $table->timestamps();

            // Set PK
            $table->primary(['id_user', 'id_journal']);

            // Set FK penulis --- user
            $table->foreign('id_user')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade')
                  ->onUpdate('cascade');

            // Set FK penulis --- journal
            $table->foreign('id_journal')
                  ->references('id')
                  ->on('journal')
                  ->onDelete('cascade')
                  ->onUpdate('cascade');
        });
    }

查看作曲家:

public function boot()
    {
        View::composer('user/show', function ($view) {
            $journal_list = User::where('id', $user_id)->with('journal')->first();
            $view->with('journal_list', $journal_list);
        });
    }

2 个答案:

答案 0 :(得分:1)

如果您想使用Eloquent,您应首先设置belongsToMany()关系:

class User extends Authenticatable
{

    public function journals()
    {
        return $this->belongsToMany('App\Journal');
    }

然后使用预先加载来加载数据:

User::where('id', $userId)->with('journals')->first();

如果您不想使用Eloquent而只需要日记:

$journal_ids = DB::table('penulis')->where('id_user', $userId)->get(['id_journal'])->toArray();
$journal_list = DB::table('journal')->whereIn('id', $journal_ids)->paginate(20);

或者使用join()

执行相同操作

答案 1 :(得分:0)

如果您使用Laravel

,为什么不使用Eloquent

首先在模型中定义relations

class User extends Model {

    public function journal(){
        return $this->belongsToMany('App\Journal', 'penulis', 'id_user', 'id_journal');
    }

}


class Journal extends Model {

    public function user(){
        return $this->belongsToMany('App\User', 'penulis', 'id_journal', 'id_user');
    }

}

当然,您需要分别使用tablefillables定义模型中的table nametable columns

要获取与users相关的特定数据,您可以使用eloquent,

User::with('journal')->paginate(20);

这将加载20 users(paginated)个相关的journal数据。

要进一步了解雄辩的关系,请查看此link

希望它能解决你的问题。