如何从使用数据透视表连接的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);
});
}
答案 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');
}
}
当然,您需要分别使用table
和fillables
定义模型中的table name
和table columns
。
要获取与users
相关的特定数据,您可以使用eloquent,
User::with('journal')->paginate(20);
这将加载20 users(paginated)
个相关的journal
数据。
要进一步了解雄辩的关系,请查看此link。
希望它能解决你的问题。