【问题标题】:Eloquent ORM relationships one-to-one or one-to-many?Eloquent ORM 关系是一对一还是一对多?
【发布时间】:2013-08-01 15:28:15
【问题描述】:

我看到了使用 Eloquent 的强大功能,但还没有在我的项目中充分利用它。我想用两张表来实现这一点:

//output - LinkedIn
echo User::find(42)->SocialProvider->Name

我有一个 user 表和一个 SocialProvider 表,其中包含社交网站列表及其名称和 api 密钥信息。

我的用户表中的记录 42 有一个列“SocialProviderID”,其中包含我的 SocialProvider 表中 LinkedIn 记录的 ID。

我已将模型类中的关系定义如下

class User extends BaseModel implements UserInterface, RemindableInterface {

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'dbo_RegisteredUser';
    protected $primaryKey = "UserID";

    public function SocialProvider() { return $this->hasOne('SocialProvider','id'); }

与

class SocialProvider extends Eloquent  {

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'dbo_SocialProvider';

public function user() { return $this->belongsTo('User','SocialProviderID'); }

但是查询和结果没有按我的意愿执行。

有人有想法吗?

我正在使用 MSSQL,但在我更熟悉的 MYSQL 中,我希望这个 ORM 场景执行如下所示的连接:

SELECT * FROM dbo_RegisteredUser
LEFT JOIN (dbo_SocialProvider)
             ON (dboRegisteredUser.SocialProviderID=dbo_SocialProvider.id)
WHERE dbo_RegisteredUser.UserID=42

谢谢

乔恩。

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    啊,我通过一些调试发现了它。我错误地指定了关系。

    在我需要的用户模型中

    class User extends Eloquent implements UserInterface, RemindableInterface {
    
        public function socialProvider() { 
            return $this->belongsTo('SocialProvider','SocialProviderID'); 
         }
    

    【讨论】:

      【解决方案2】:

      嗯……关系使用相关模型的 ID……而您没有在任何地方引用实际用户……

      您需要在存储user_id 的社交提供者表中有一个列

      然后在你的函数中...

      public function SocialProvider() { return $this->hasOne('SocialProvider','user_id'); }
      

      还有……

      public function user() { return $this->belongsTo('User'); }
      

      【讨论】:

      • 嗯,我想问题的原因可能是我没有正确定义关系。每个用户只有一个社交提供者(LinkedIn、Facebook),因此外键约束是 user.SocialProviderID 并且是到 SocialProvider.id 的直接映射话虽如此,SocialProvider 应该与用户没有关系。只有用户应该引用社交提供者(使用 user.SocialProviderID)
      • 那么我马上看到的第一件事是,你没有在第一堂课中扩展 Eloquent ......你只是在扩展 BaseModel ...... ..但我来自 Laravel3,所以它可能在 L4 中完全不同。
      • 是的,这是一个有效的观点。但是从基本模型我扩展了 Eloquent。如果我直接扩展 Eloquent,我仍然得到一个空的结果。不过谢谢..
      • 我相信这些是倒退的。 public function socialProvider() { return $this->belongsTo('User','SocialProviderID'); } 和 public function user() { return $this->hasOne('SocialProvider'); }
      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      相关资源
      最近更新 更多