Laravel Принадлежит, чтобы вернуть пустой объект - PullRequest
0 голосов
/ 24 марта 2020

У меня есть таблица, называемая сообщениями и пользователями. users - таблица пользователей по умолчанию, сгенерированная laravel auth. по какой-то причине в моей функции postMessage в моем контроллере, когда я пытаюсь вернуть

return response()->json(['s' => $broadcastMessage, 'r' => $broadcastMessage->MessageOwner()]);

, корабль отношений возвращает пустой объект. я знаю, что отношение MessageOwner работает, потому что я использую его в другой функции, и оно прекрасно работает, но я не могу понять, почему оно здесь не работает? Я убедился, и он хранит user_id, и это правильный идентификатор.

Обратите внимание, что оно возвращает сообщение.

здесь есть функция миграции вверх

Schema::create('messages', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->bigInteger('user_id')->unsigned()->index();
            $table->foreign('user_id')->references('id')->on('users');

            $table->longText('message');

            $table->timestamps();
        });

здесь моя модель сообщения

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    protected $table = 'messages';
    protected $fillable = [
        'user_id', 'message'
    ];

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function MessageOwner()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function job()
    {
        return $this->belongsToMany(Job::class);
    }
}

и здесь моя функция контроллера

public function postMessage(Request $request)
    {
        try {
            $message = Message::create([
                'user_id' => $request->input('user_id'),
                'message' => $request->input('message')
            ]);

            $job = Job::find($request->input('job_id'));
            $job->messages()->attach($message);

            $broadcastMessage = Message::find($message->id);

            return response()->json(['s' => $broadcastMessage, 'r' => $broadcastMessage->MessageOwner()]);

            event(new MessagePushed($broadcastMessage));

            return response()->json([
                'success' => true,
                'message' => 'success',
            ]);

        } catch (\Exception $exception) {
            return response()->json([
                'success' => false,
                'error' => true,
                'message' => $exception->getMessage()
            ], 500);
        }
    }

1 Ответ

1 голос
/ 24 марта 2020

Вы вызываете метод отношения, а не его значение.

Попробуйте без ():

return response()->json(['s' => $broadcastMessage, 'r' => $broadcastMessage->MessageOwner]);

Также вы должны рассмотреть возможность использования lower_snake_case для все ваши методы отношений и назовите внешний ключ relationshio_name_id, поэтому вам не нужно вручную определять имя внешнего ключа, Laravel автоматически его угадывает.

...