我有两节课。A和B。A类扩展Laravel,B类扩展A。它们表示两个表。与类B关联的表没有主键,也没有外键(A_id)。情况是这样的:
class A extends Eloquent
{
protected $table = 'a';
}
class B extends A
{
protected $table = 'b';
protected $primaryKey = 'a_id';
}我需要在类B中指定主键,因为laravel尝试使用以下命令构建B对象
SELECT * FROM B where id = ?但是字段id不存在。
问题是当我试图从B对象es访问A方法时
$b = B::find(1);
$b->method_in_a_class();该方法名为execute a query in a C table (也是另一个类),与A表链接,而不是与B表链接,因此框架执行以下查询:
SELECT * FROM C WHERE B_id = ?但这将会是
SELECT * FROM C WHERE A_id = ?为什么??
谢谢
发布于 2014-08-01 21:46:48
解决这个问题最简单的方法可能是使用一对一关系,这样你就有了:
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');
}
}希望这能解决你的问题!
发布于 2014-08-02 14:53:14
如果在第二个表中没有主键,则应考虑合并表。如果没有主id,您无论如何都不能将其用作雄辩的模型。你有这个问题可能是因为一个糟糕的数据库设计。
发布于 2014-08-04 04:11:47
首先,回答您的问题: Eloquent使用B名称作为外键,因为您没有告诉它不要这样做。
想象一下这个场景(和你的不完全一样,但它是真实的):Post模型,Category模型,RootCategory模型:
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',这可能就是在您的例子中发生的事情。
原因是:
getForeignKey()方法来猜测它getForeignKey()使用$this,它是RootCategory对象,所以外键将是root_category_id。
所以有两种方法可以解决这个问题:
1更好的
// RootCategory model
public function getForeignKey()
{
return 'category_id';
}2也可以工作,但是需要编辑父类。
// Category model
public function posts()
{
return $this->hasMany('Post', 'category_id');
}https://stackoverflow.com/questions/25080358
复制相似问题