防止Laravel覆盖主键

时间:2014-11-12 18:09:40

标签: join laravel primary-key

好的,我遇到的问题源于Laravel在执行Join时覆盖了我的表(页面)中的主键(id)。有没有办法在Join之后保留页面中的主键?我需要将这些主键值保存为另一个查询。

继承我的桌面结构:

LANGS id(pk) - 名称 - 代码

网页 id(pk) - parent_id(fk) - lang_parent_id(fk) -


MainPageInterface

namespace Repositories\MainPage;

interface MainPageInterface {
  public function getAllMainPages($lang);
}

MainPageRepository

namespace Repositories\MainPage;

use Page;

class MainPageRepository implements MainPageInterface{

  public function getAllMainPages($lang)
  {
    $mainPage = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
            ->where('parent_id', null)
            ->where('code', '=', $lang)
            ->get();

    return $mainPage;
  }
}

控制器

use Repositories\CPage\CPageInterface;
use Repositories\MainPage\MainPageInterface;

class HomeController extends BaseController {

protected $cPage;
protected $mainPage;

  public function __construct(CPageInterface $cPage, MainPageInterface $mainPage)
  {
    $this->cPage = $cPage;
    $this->mainPage = $mainPage;
  }

  public function getPages($lang, $slug)
  {
    $cPage = $this->cPage->getCurrentPage($lang, $slug);

    $mainPages = $this->mainPage->getAllMainPages($lang);

    $allPages = $this->getAllPages($mainPages);

    return View::make('index')
    ->with('cPage', $cPage)
    ->with('mainPages', $mainPages)
    ->with('allPages', $allPages);
  }

  private function getAllPages($pages) {

    $allPages = array();

    foreach ($pages as $page) {
        $subArr = array();
        $subArr['title'] = $page->title;
        $subArr['slug'] = $page->slug;
        $subPages = Page::where('parent_id', '=', $page->id)
                    ->where('lang_parent_id', '=', $page->lang_parent_id)
                    ->get();

        if (!$subPages->isEmpty()) {
            $result = $this->getAllPages($subPages);

            $subArr['sub'] = $result;
        }

        $allPages[] = $subArr;
    }
    return $allPages;
  }
}

1 个答案:

答案 0 :(得分:0)

好的,对不起我的前2个解决方案无效。

我做了一些别名的研究。

尝试:

$mainPage = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
            ->where('parent_id', null)
            ->where('code', '=', $lang)
            ->select('langs.*', 'pages.*')
            ->get(array('langs.id AS language_ID));

首先指定要在select函数中选择的数据,然后使用get函数获取查询,并指定列重命名。

我已经用我的数据尝试过了,我得到了你想要的东西。