首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel中的继承

Laravel中的继承
EN

Stack Overflow用户
提问于 2014-08-01 20:32:32
回答 3查看 201关注 0票数 0

我有两节课。A和B。A类扩展Laravel,B类扩展A。它们表示两个表。与类B关联的表没有主键,也没有外键(A_id)。情况是这样的:

代码语言:javascript
复制
class A extends Eloquent 
{
   protected $table  = 'a';
}

class B extends A
{
   protected $table  = 'b';
   protected $primaryKey = 'a_id';
}

我需要在类B中指定主键,因为laravel尝试使用以下命令构建B对象

代码语言:javascript
复制
 SELECT * FROM B where id = ?

但是字段id不存在。

问题是当我试图从B对象es访问A方法时

代码语言:javascript
复制
$b = B::find(1);
$b->method_in_a_class();

该方法名为execute a query in a C table (也是另一个类),与A表链接,而不是与B表链接,因此框架执行以下查询:

代码语言:javascript
复制
SELECT * FROM C WHERE B_id = ?

但这将会是

代码语言:javascript
复制
SELECT * FROM C WHERE A_id = ?

为什么??

谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-08-01 21:46:48

解决这个问题最简单的方法可能是使用一对一关系,这样你就有了:

代码语言:javascript
复制
class A extends Eloquent 
{
   protected $table  = 'a';

   public function b()
   {
        return $this->hasOne('B');
   }
}

class B extends Eloquent
{
   protected $table  = 'b';

   public function a()
   {
        return $this->belongsTo('A');
   }
}

希望这能解决你的问题!

票数 0
EN

Stack Overflow用户

发布于 2014-08-02 14:53:14

如果在第二个表中没有主键,则应考虑合并表。如果没有主id,您无论如何都不能将其用作雄辩的模型。你有这个问题可能是因为一个糟糕的数据库设计。

票数 0
EN

Stack Overflow用户

发布于 2014-08-04 04:11:47

首先,回答您的问题: Eloquent使用B名称作为外键,因为您没有告诉它不要这样做。

想象一下这个场景(和你的不完全一样,但它是真实的):Post模型,Category模型,RootCategory模型:

代码语言:javascript
复制
class Category extends \Eloquent {
  public function posts()
  {
    return $this->hasMany('Post');
  }
}

// categories are hierarchical, self referencing table
class RootCategory extends Category {
  // global scope and stuff
  protected $table = 'categories';
}

class Post extends \Eloquent {
  public function category()
  {
    return $this->belongsTo('Category');
  }
}

现在,使用上面的设置,调用简单的动态属性将抛出- column not found 'posts.root_category_id',这可能就是在您的例子中发生的事情。

原因是:

  1. 您没有指定要查找的外键...
  2. ...so Eloquent调用泛型getForeignKey()方法来猜测它

getForeignKey()使用$this,它是RootCategory对象,所以外键将是root_category_id

所以有两种方法可以解决这个问题:

1更好的

代码语言:javascript
复制
// RootCategory model
public function getForeignKey()
{
  return 'category_id';
}

2也可以工作,但是需要编辑父类。

代码语言:javascript
复制
// Category model
public function posts()
{
  return $this->hasMany('Post', 'category_id');
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25080358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档