我试图将Jeffrey Way的多对多关系教程应用到我的私人消息应用程序中,但我遇到了困难。我试图获得与用户关联的2个会话haha
和hehe
。但是,Laravel给了我错误:
Column not found: 1054 Unknown column 'Conversations.user_id' in 'where clause' (SQL: select * from `Conversations` where `Conversations`.`user_id` = 1)
我在对话表中有这些数据:
+---------+----------+
| conv_id | name |
+---------+----------+
| 1 | haha |
| 2 | hehe |
+---------+----------+
在我的user_conversations表中:
+----+-------------+--------+
| id | conv_id | user_id|
+----+-------------+--------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
+----+-------------+--------+
1。我试过了:在控制器中:
用户:return $this->belongsToMany('User','id');
Conversatons :return $this->hasMany('Conversations','conv_id');
但我得到的结果是:haha
而不是haha
和hehe
2。我也尝试过:
用户:return $this->belongsToMany('User','user_conversations');
Conversatons :return $this->hasMany('Conversations','user_conversations');
但是laravel给我的回答是:
Column not found: 1054 Unknown column 'Conversations.user_conversations' in 'where clause' (SQL: select * from `Conversations` where `Conversations`.`user_conversations` = 1)
我在Laravel中仍然相对较新,所以我可能会犯一些愚蠢的错误。
这是我的代码:
MODEL
会话
class Conversations extends Eloquent {
protected $table = 'Conversations';
protected $fillable = array('name');
public function users(){
return $this->belongsToMany('User');
}
}
用户
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface {
....
public function conversations(){
return $this->hasMany('Conversations');
}
}
控制器
对话控制器
public function create()
{
$loginuser = User::find(Auth::user()->id);
$conversations = $loginuser->conversations;
return View::make('msgsystem.Conversations.Conversations',array('conversations'=>$conversations));
}
MIGRATIONS(在函数up()中)
用户
Schema::create('users',function($table)
{
$table->increments('id');
$table->string('email')->unique();
$table->string('password',100);
$table->string('name',150);
$table->string('usertype',50);
$table->boolean('block');
$table->string('remember_token',100);
$table->timestamp('lastlogin_at');
$table->timestamps();
$table->softDeletes();
});
会话
Schema::create('Conversations', function(Blueprint $table)
{
$table->increments('conv_id')->index();
$table->string('name',100);
$table->timestamps();
});
user_conversations
Schema::create('user_conversations', function(Blueprint $table)
{
$table->increments('id')->unsigned();
$table->integer('conversation_id')->unsigned()->index();
$table->foreign('conversation_id')->references('conv_id')->on('conversations')->onDelete('cascade');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
改进代码的奖励积分。非常感谢你!
答案 0 :(得分:6)
在您的多对多关系示例中,用户可以进行多次对话,其中对话也可以由许多用户共享。
在这种情况下,我们需要对用户模型的关系和对话模型的反转使用belongsToMany()
方法。
class User
{
public function conversations()
{
return $this->belongsToMany('Conversations');
}
}
class Conversations
{
public function users()
{
return $this->belongsToMany('User');
}
}
如果您需要为数据透视表使用不同的名称,或覆盖关联的键,则可以将它们作为可选参数传递。
return $this->belongsToMany(
'Conversations', // related_table
'user_conversations', // pivot_table
'user_id', // key_1
'conversations_id' // key_2
);
答案 1 :(得分:0)
也许它会帮助某人。我失去了很多小时,然后看数据库...
我忘了将'deleted_at'默认值设置为NULL (使用软删除时)。