0

好的,这是我的代码:我的模型中的关系

// message model
    public function profile() {
        return $this->has_one('Profile', 'id');
    }

// profile model
    public function message(){
        return $this->has_many('message', 'id')->order_by('created_at', 'asc');
    }

我的控制器:

    public function get_MyMessages(){
        $per_page = 50; // results per page
        $messages = Message::with('profile')->where('receiver_id', '=', Auth::user()->id)->or_where('sender_id', '=', Auth::user()->id)->take($per_page);

        $messages = $messages->paginate( $per_page ); 
        $messages->appends( array($per_page) )->links(); 


        $data = array( // data to pass to view
        'title' => 'My Messages',
        'messages' => $messages,
    );
    return View::make('myProfile.myMessages',$data); // create view
}

在我看来,我可以这样做:

@foreach($messages->results as $message)
    {{ $message->message }}
@endforeach

效果很好,但是当我尝试时: {{ $messages->profile->first_name }}

我收到以下错误:尝试获取非对象的属性如果我尝试:{{ print_r($message->profile }} 所有数据都在那里,我只是无法访问它。

我已经尝试了一切我做错了什么???

4

1 回答 1

2
// message model
    public function profile() {
        //the following statement means that every message has a profile (not true):
        //instead, let's define the other side of the profile relationship.
        return $this->has_one('Profile', 'id');
    }

// profile model
    public function message(){
        //the following statement means that a profile has many messages (true)
        return $this->has_many('message', 'id')->order_by('created_at', 'asc');
    }

这段代码本质上意味着:

配置文件有许多消息,每条消息都有一个配置文件。

在这些关系声明中,您只创建了部分关系,而不是接收端。根据您的代码,我假设您使用的是 Laravel 3(Laravel 4 关系是骆驼式而不是蛇式)。

以下是基于 Laravel 3 的修正:

// message model
    public function profile() {
        return $this->belongs_to('Profile', 'id');
    }

// profile model
    public function message(){
        return $this->has_many('message', 'id')->order_by('created_at', 'asc');
    }

这段代码意味着:

配置文件有许多消息,并且消息属于配置文件。

编辑:您的刀片语法也需要编辑。using{{ $messages->profile->first_name }}是调用变量profile上的方法,该方法$messages返回延迟加载查询的结果,但不返回消息对象(或模型实例)。请记住,模型message.phpprofile.php代表单个对象(因此一条消息或一个配置文件)。其中包含的查询$messages是非对象,它既不是配置文件也不是消息,而是消息的集合(或组)。

foreach 循环之所以有效,是因为它本质上打破了$messages要使用的对象列表,在 foreach 标记内,您可以指定要对每个对象执行的操作,在您的情况下,您希望显示每个对象的消息。在这个 foreach 循环中,您可以成功访问该profile方法。

即你可以这样做:

@foreach($messages->results as $message)
    {{ $message->message }}
    {{ $message->profile->first_name }}
@endforeach

如果您不希望在每条消息中显示配置文件:

要获取经过身份验证的用户的个人资料,以显示他们的个人资料,您可以这样做Auth::user()->profile,假设您在各自的模型中具有这种关系。您的延迟加载查询已经获取了经过身份验证的用户的配置文件,因此该命令不会创建第二个查询(感谢 eloquent)。

于 2013-05-11T23:11:01.483 回答