【问题标题】:Recursive Loop when trying to fetch models尝试获取模型时的递归循环
【发布时间】:2015-09-29 12:12:25
【问题描述】:

MYSQL

#advertisements
`id` -> primary key
`title` -> varchar(100)

#advertisementsTags

id -> 主键 tag -> varchar(40)

#advertisements_has_tags
`tag_id`  
`ad_id`  
##Foreign keys
fk_tag_id for column `tag_id` points to `AdvertisementsTags`.`id` 
fk_ad_id for column `ad_id` points to `Advertisements`.`id`

广告模型

   public function tags(){
      return $this->belongsToMany('App\Models\Advertisements\AdvertisementTagsModel','advertisement_has_tags','fk_ad_id','id');
    }

广告标签模型

  public function advertisements(){
        return $this->belongsToMany('App\Models\Advertisements\AdvertisementsModel','advertisement_has_tags','fk_tag_id','id');
    }

广告控制器

  public function index(){
        $finder = AdvertisementsModel::find(1);
        $tags=$finder->tags();
        echo '<pre>';
            var_dump($tags);
        echo '</pre>';
    }

当我进入调用AdvertisementsControllerindex()/advertisements 路由时,它陷入了递归循环,我无法正确声明广告和标签之间的这种关系。

调用$tags()-&gt;get() 后得到以下sql 错误,不知道它是如何构建该查询的。为什么它构建aspivot_fk_ad_id``

    SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'advertisement_has_tags.fk_ad_id' in 'field list' (SQL: select 
`advertisement_tags`.*, `advertisement_has_tags`.`fk_ad_id` as `pivot_fk_ad_id`,
 `advertisement_has_tags`.`id` as `pivot_id` from `advertisement_tags` inner 
join `advertisement_has_tags` on `advertisement_tags`.`id` = 
`advertisement_has_tags`.`id` where `advertisement_has_tags`.`fk_ad_id` = 1)

有什么想法吗?

【问题讨论】:

  • 你确定循环是因为关系吗?也许这与您的路线甚至 htaccess 有关?
  • 当我只使用var_dump('hello world'); 它转储hello world 也许它的var_dump 试图遍历结果?
  • 你的 mySQL 表示法让我有点困惑。字段名称是什么?也许您需要使用tag_id 而不是fk_tag_idad_id 而不是fk_ad_id
  • fk_ad_idfk_tag_idAdvertisements_has_tags 的外键,将编辑以使其更清晰
  • 首先尝试使用$finder-&gt;tags()-&gt;get(),因为你使用的是方法访问​​

标签: mysql laravel foreign-keys eloquent


【解决方案1】:

经过一番努力,当我进行以下更改时,它起作用了。

AdvertisementsModel将参数切换为'ad_id','tag_id');

AdvertisementTagsModel将参数切换为'tag_id','ad_id');

广告控制器

  public function index(){
        $finder = AdvertisementsModel::find(1);
        $tags=$finder->tags()->get();
        echo '<pre>';
            foreach($tags as $t){
             echo $t->tag."\n";
            }
        echo '</pre>';
    }

很遗憾 laravel 没有提供足够的文档..

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多