提问者:小点点

与拉威尔的关系有很多问题


我在幼虫中使用hasManyover关系时遇到了问题。下面的留档使用的例子有:

countries
id - integer
name - string

users
id - integer
country_id - integer
name - string

posts
id - integer
user_id - integer
title - string

下面是我如何在模型中建立关系的

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
public function posts() {

    return $this->hasManyThrough('App\Post', 'App\User', 'user_id', 'country_id', 'id');
}
}

这是用户模型

class User extends Authenticatable
{
use Notifiable;

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'email', 'password',
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

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

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

这是Posts模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
     public function user() {

    return $this->belongsTo('App\User');
}
}

因此,该网站没有详细介绍如何通过国家模型提取帖子。使用routes文件,这是我使用的查询

Route::get('posts/countries/{id}', function($id) {

$countries = App\Country::where('id', $id)->get();

return $countries->posts;

});

在我看来,我像医生说的那样正确地建立了关系。用户表上有一个国家/地区id,因此我不确定查询是否错误,或者可能是我设置的关系不正确。


共2个答案

匿名用户

实际上,您并不是在请求关系,您只是在查看国家的属性。

如果要在查询生成器中加载帖子,则需要在生成查询时使用('posts')添加。(在您呼叫-

Route::get('posts/countries/{id}', function($id) {

$country = App\Country::with('posts')->where('id', $id)->first();

return $country->posts;

});

或者,如果您想偷懒,您可以通过执行-

Route::get('posts/countries/{id}', function($id) {

$country = App\Country::with('posts')->where('id', $id)->first();

return $country->posts();

});

注意:在这两种情况下,我都更改了-

-

匿名用户

@尼克拉斯·凯文·弗兰克

你的解决方案对我不起作用。至少不完全是这样,但你在某些方面是对的。我四处摸索,发现查询的效果更好:

Route::get('posts/countries/{id}', function($id) {

$country = App\Country::where('id', $id)->first();

return view('country')->with('country', $country);
});

所以,就像你说的,它不自信地需要-