如何设置Laravel';的查询生成器


How can I set the array key returned by Laravel's query builder?

我有两个表,pageedit

page

+----+-----------+
| id | page_name |
+----+-----------+
|  1 | page      |
+----+-----------+

edit

+----+---------+------+
| id | page_id | name |
+----+---------+------+
|  1 |       1 | home |
|  1 |       1 | side |
+----+---------+------+

现在我定义了一种将两者联系在一起的关系。它返回如下内容:

array(
  'id' => 1,
  'page_name' => 'page',
  'edit' => array(
    0 => array(
      'id' => 1,
      'page_id' => 1,
      'name' => 'home'
    ),
    1 => array(
      'id' => 2,
      'page_id' => 1,
      'name' => 'side'      
    )
  )
)

我希望能够将edit数组的键设置为某一列的值。像这样:

array(
  'id' => 1,
  'page_name' => 'page',
  'edit' => array(
    'home' => array( // the key is the name column
      'id' => 1,
      'page_id' => 1,
      'name' => 'home'
    ),
    'side' => array( // the key is the name column
      'id' => 2,
      'page_id' => 1,
      'name' => 'side'      
    )
  )
)

如何使用Laravel的查询生成器来实现这一点?或者这是我必须格式化的东西&使用循环手动构建?

一个解决方案

//the page you will work with
$page = Page::find(1);
//his edits, by pairs array('name' => 'id', ..)
$page_edit_lists = $page->edit()->list('id', 'name');    
//now, look for a name
$edit_name = 'grammar fix';
$edit_id = array_get($page_edit_lists , $edit_name); //if exist or null
//now get the row by is ID
$page_edits = $page->edit()->get();
//when edits data is already loaded, so it will loop for you..
$edit = $page_edits->find($edit_id);
//or by dynamic querying, SELECT .. WHERE id = ? ..
$edit = $page->edit()->find($edit_id);

没有测试,但我想你已经明白了。很抱歉我英语不好。。

http://laravel.com/docs/5.1/collectionskeyBy()。

$collection=收集([['product_id'=>'prod-100','name]=>'desk'],['product_id'=>'prod-200','name'=>'chair'],]);

$keyed=$collection->keyBy('product_id');

$keyed->all();

/*['prod-100'=>['product_id'=>'prod-1','name'=>'Desk'],'prod-200'=>['product_id'=>'prod-2','name'=>'Chair'],]*/