Laravel 5.2模型关系

时间:2016-06-29 10:47:23

标签: php sql laravel laravel-5 relationship

我是Laravel的新手并且有一个关系问题。

目标是让所有新闻都在news.page_id = page.idpage.pagetype_id = pagetype.id WHERE pagetype.component = newspage.app_id = 1

之间
class News extends Model
{
    protected $table = 'news';
    protected $fillable = ['page_id', 'title', 'description', 'active', 'created_at', 'updated_at'];
}

class Page extends Model
{
    protected $table = 'pages';
    protected $fillable = ['app_id', 'unique_id', 'pagetype_id', 'title', 'picture_url', 'short_description', 'description', 'valid_since', 'valid_until', 'extras', 'active', 'created_at', 'updated_at'];

    public function pagetype() {
        return $this->belongsTo('App\Models\PageType', 'pagetype_id');
    }
}


class PageType extends Model
{
    protected $table = 'pagetypes';
    protected $fillable = ['pagetype', 'component', 'active', 'created_at', 'updated_at'];

    public function page() {
      return  $this->belongsToMany('App\Models\Page', 'pagetypes', 'id', 'id');
    }
}

// now i need   All News Items where page.pagetype_id = pagetypes.id and patchtypes.component = news

// First Attempts are

Page::whereHas('pagetype', function ($q) {
            $q->where('component', 'news');
        })->where(['app_id' => 1])->get();

// result is all Pages which has the proper component news. 

这是我尝试过的,但在我的尝试中,我只会收到正确的页面,但当然不是新闻。

我的“当前”解决方案是获取所有页面,然后循环遍历News::where('page_id', $myPageId)。但我非常确定有可能找到一个合适的关系来获取新闻。

我不能做任何其他模型,因为有许多不同的页面类型和组件。

到目前为止,谢谢。

2 个答案:

答案 0 :(得分:0)

您需要为新闻模型添加关系功能。

public function pages() {
    return $this->belongsTo('App\Models\Page');
}

并通过News模式进行调用。

News::with('pages')->where('app_id',1);

答案 1 :(得分:0)

首先,我认为你错了PageType关系

class PageType extends Model
{
    protected $table = 'pagetypes';
    protected $fillable = ['pagetype', 'component', 'active', 'created_at', 'updated_at'];

    public function page() {
      return  $this->hasMany('App\Models\Page');
      // if i understood you correctly you haven't got any pivot table
    }
}

然后您应该将NewsPage链接起来

News.php

class News extends Model
{
    protected $table = 'news';
    protected $fillable = ['page_id', 'title', 'description', 'active', 'created_at', 'updated_at'];
    public function page() {
      return  $this->belongsTo('App\Models\Page');
    }
}

page.php文件

class Page extends Model
{
    protected $table = 'pages';
    protected $fillable = ['app_id', 'unique_id', 'pagetype_id', 'title', 'picture_url', 'short_description', 'description', 'valid_since', 'valid_until', 'extras', 'active', 'created_at', 'updated_at'];

    public function pagetype() {
        return $this->belongsTo('App\Models\PageType');
    }

    public function news() {
        return $this->hasMany('App\Models\News');
    }
}

然后你就可以实现目标

News::whereHas('page', function($q) use($appId) {
    $q->where('app_id',$appId);
})->whereHas('page.pagetype', function($q) {
    $q->where('component', 'news');
})->get();