为什么belongsTo()返回null?

时间:2018-01-18 11:21:56

标签: php laravel

我有两个模型和两个表。具有数据库结构的第一个模型名称Inbox

enter image description here

第二个模型名称是StudentData,其数据库结构为:

enter image description here

我将使用我的方法返回route('/sended')所有消息,以获取所需的消息:

public function getMessages($message_type = "new")
{
    $user_id = Auth::user()->id;

    $inbox = new Inbox();

    $paginate = 3;

    switch ($message_type) {

        case 'sended':
            $messages = $inbox->where('sender', $user_id)
                              ->where('trashed_in_sender', 0)
                              ->where('show_in_sender', 0)
                              ->orderBy('created_at', 'desc')
                              ->paginate($paginate);
            break;
        default:
            return abort(404);
            break;
    }

    return $messages;
}

我的模型Inbox中有方法:

public function messageSender()
{
    return $this->belongsTo("App\StudentData", 'sender');
}

public function messageRecipient()
{
    return $this->belongsTo("App\StudentData", 'recipient');
}

当我在视图$message->messageSender中调用给定NULL的结果时。为什么我无法使用sender id表格中inboxes表中的student_datas来获取数据

1 个答案:

答案 0 :(得分:1)

所以,我有几个问题......

1)您的User和StudentData模型究竟是如何交互的?有2个模型看起来似乎是1:1的关系,这有点奇怪吗? 为什么不使用用户模型?
(你甚至有用户模型还是我误解了一些东西?)

2)我认为你的方向是错误的...如果你已经拥有用户模型,请尝试从那里获取发送的消息。我会举个例子。

假设您有一个用户模型和一个收件箱模型,您有一个"发件人"和"收件人",两者都具有用户模型的ID 所以在收件箱模型中我们有:

public function messageSender()
{
    return $this->belongsTo("App\User", 'sender');
}

public function messageRecipient()
{
    return $this->belongsTo("App\User", 'recipient');
}

但为什么不从另一个方向走?我们可以在用户模型中编写关系,如

public function sentMessages()
{
    return $this->hasMany("App\Inbox", 'sender');
}
public function receivedMessages()
{
    return $this->hasMany("App\Inbox", 'recipient');
}

现在,只需使用

即可获取所有已发送的消息(即用户为发件人的所有消息)
$user->sentMessages

并对此进行操作。或者你甚至可以建立一个特殊的帮助关系(我的名字很糟糕,找到一个更好的...例如)

public function unreadSentMessages()
{
    return $this->hasMany("App\Inbox", 'sender')
                ->where('trashed_in_sender', 0)
                ->where('show_in_sender', 0)
                ->orderBy('created_at', 'desc');
}

并且可以将$ user-> sentMessages用于他的所有邮件,也可以将$ user-> unreadSentMessages用于您案例中所需的邮件。