Laravel 4.2 Eloquent与自定义表名的关系

时间:2014-06-18 13:32:36

标签: php laravel orm laravel-4 eloquent

我试图通过$post->file->url访问文件表上的url属性,但我得到“试图获取非对象属性”错误。我的表和模型不同,因为我不能使用File作为模型名称。有什么遗失的吗?我希望有人能找到解决方案。这是我的桌子:

- posts:
 [PK] id 
      title
 [FK] featured_image 

 - files:
 [PK] id                
      title
      url

我的模特:

class TheFile extends \Eloquent 
{
   protected $table = 'files';

   public function post() {
     return $this->belongsTo('Post');
   }
}


class Post extends \Eloquent 
{   
  protected $table = 'posts';

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

提前感谢。

2 个答案:

答案 0 :(得分:2)

也许我错了,但正如我所看到的,你实际上这里的关系是错误的。如果表X有一个表Y,那么FK字段位于Y并且与X上的PK相关。但是你反过来了。

因此,您需要做以下两件事之一:

  1. 更改您的数据库,将post_id放在files上,而不是featured_image上的file`.`id(点posts}

    < / LI>
  2. 更改您的关系以匹配您的数据库结构:

    class TheFile extends \Eloquent
    {
        protected $table = 'files';
    
        public function post() {
            return $this->hasOne('Post');
        }
    }
    
    
    class Post extends \Eloquent
    {
        protected $table = 'posts';
    
        public function file() {
            return $this->belongsTo('TheFile');
        }
    }
    

    如果您不打算更改表格,显然还会对您的各种字段进行更改。


  3. 基本的经验法则是,如果一个表有FK,那么它就是'属于'表。另一张表是'有一个'或'有很多'。这个规则的一个小例外显然是“属于很多”,其中一个表可以与另一个没有FK的表相关 - 但即使这是同一规则的专用版本 - X'有很多'{{1 }和X_Ys'有许多'YX_Ys属于X_YX属于X_Y。所以它真的只是语法糖。

答案 1 :(得分:2)

我将我的表名改为medias,将我的模型改为Media。然后将这些代码放入Post模型中。其作品。表,模型和方法的名称必须相似。

public function media() {
    return $this->belongsTo('Media', 'featured_image', 'id');
}