Laravel 5中的Eloquent ORM关系问题

3

我将在 Laravel 5 上创建消息系统,但在恢复页面上无法获取发送者信息(例如名称、电子邮件等)

我有消息表:

public function up()
    {
        Schema::create('messages', function(Blueprint $table){
            $table->increments('id');
            $table->integer('destination_id')->unsigned();
            $table->integer('source_id')->unsigned();
            $table->string('sujet');
            $table->text('contenu');
            $table->boolean('vu')->default(0);
            $table->boolean('repondu')->default(0);
            $table->timestamps();
            $table->foreign('source_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('destination_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

在我创建的模型上添加以下内容:

消息模型:

class Message extends Model {

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

在用户模型上,我添加了以下函数:

public function message()
{
    return $this->hasMany('App\Message');
}

当我尝试获取用户消息并想要获得例如{{$message->user->name}}时,我收到一个错误消息,提示我试图获取非对象的属性。

这是该页面的控制器

2个回答

2

当您使用return $this->belongsTo('App\User');时,默认用户键字段为table_name_id,例如在此示例中为user_id

我看到您需要与用户表建立关系:

$table->integer('destination_id')->unsigned();
$table->integer('source_id')->unsigned();

因此,最好的解决方案是创建两种方法,如下:

class Message extends Model 
{
    public function source()
    {
        return $this->belongsTo('App\User', 'source_id');
    }

    public function destination()
    {
        return $this->belongsTo('App\User', 'destination_id');
    }
}

那么您可以调用:

{{$message->source->name}}

并且

{{$message->destination->name}}

当然你也可以用其他方式来命名该方法,例如:sourceUser()

1

看起来你没有为消息模型设置外键。如果一个用户有多条消息,你应该像这样添加外键

    public function up()
        {
            Schema::create('messages', function(Blueprint $table){
                $table->increments('id');
                $table->integer('user_id')->unsigned();
                $table->integer('destination_id')->unsigned();
                $table->integer('source_id')->unsigned();
                $table->string('sujet');
                $table->text('contenu');
                $table->boolean('vu')->default(0);
                $table->boolean('repondu')->default(0);
                $table->timestamps();
                $table->foreign('source_id')->references('id')->on('users')->onDelete('cascade');
                $table->foreign('destination_id')->references('id')->on('users')->onDelete('cascade');
            });
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接