Laravel Cities关系外键

时间:2013-01-15 10:29:50

标签: php orm laravel relation

我真的很喜欢laravel,我确定我做错了什么

我有2张桌子。 Citiesusers_metadata

我的城市表看起来像这样

id | City        |
1  | New York    |
1  | Los Angeles |

用户元数据

user_id | firt name | last name | cities_id |
1       | Jonh      | Doe       |         2 |

所以我的问题是当我创建一个关系,我得到纽约,因为城市ID与用户ID匹配

城市模型

class City extends Eloquent 
{
    public static $table = "cities";

    public function profile()
    {
        return static::has_many('Profile');
    }
}   

个人资料模型

class Profile extends Eloquent 
{
    public static $timestamps = false;

    public static $table = "users_metadata";

    public static $key = "user_id";

    public function city()
    {
        return static::has_one('City');
    }
}   

错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'profile_id' in 'where clause'

SQL: SELECT * FROM `cities` WHERE `profile_id` = ? LIMIT 1

Bindings: array (
  0 => 1,
)

如果我没有通过id有一个我得到以下错误

好的,我理解这一点。

所以我的问题是我能否在我的关系中以某种方式传递外键cities_id来匹配?或者我干脆做错了?有人可以给我一个基本的例子吗?

谢谢大家

4 个答案:

答案 0 :(得分:2)

试试这个:

城市模型

class City extends Eloquent 
{
    public static $table = "cities";
    public function profile()
}   

个人资料模型

class Profile extends Eloquent 
{
    public static $timestamps = false;
    public static $table = "users_metadata";
    public static $key = "user_id";
    public function city()
    {
        return static::belongs_to('City');
    }
}

我遇到了同样的问题,认为我应该使用has_one,但我需要使用belongs_to。 user1808639可能无法正常工作,因为你在城市模型中仍然有'has_many'。

答案 1 :(得分:1)

试试这个:

class Profile extends Eloquent
{
    public function city()
    {
        return $this->belongs_to('City'); // city_id in the table
    }
}

答案 2 :(得分:0)

Laravel有一种自动检测外键的方法。所以对于你的数据库模式...这个模型应该工作正常 请尝试以下

user_id | firt name | last name |   city_id | //city not cities
1       | Jonh      | Doe       |         2 |

-

class Profile extends Eloquent 
{
    public static $timestamps = false;
    public static $table = "users_metadata";

    public function city()
    {
        return $this->has_one('City');
    }
}

/

class City extends Eloquent 
{
    public static $timestamps = false;

    public function profiles()
    {
        return $this->has_many('Profile');
    }
}

答案 3 :(得分:0)

表行不应包含空格。所以重命名“firt name”| “姓氏”中的“姓氏” “姓”。 SQL错误告诉我,你正在以相反的方式调用模型,例如City :: find(1),在这种情况下,Laravel期望在“Cities”表中的配置文件的外键通常是“profile_id”。

我想你正在寻找这样的东西:

$user_id = 1; 
$user = Profile::find($user_id);

echo $user->firstname." ".$user->lastname." lives in ".$user->city->city;