Красноречивые отношения ORM на laravel 5

Я создаю систему сообщений на 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}}, я получаю сообщение об ошибке, что я пытаюсь получить свойство не-объекта

это контроллер этой страницы


person S4L4H    schedule 02.05.2016    source источник


Ответы (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().

person Filip Koblański    schedule 02.05.2016

Кажется, вы не установили внешний ключ для модели сообщения. Если у одного пользователя много сообщений, вы должны добавить такой внешний ключ

    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');
            });
        }
person Pavel Krasnoperov    schedule 02.05.2016