2014-09-04 130 views
1

我有两个表与此schmea的hasMany关系:获取与雄辩Laravel

mysql> show columns from table_1; 
+-------------+------------------+------+-----+---------------------+----------- 
| Field  | Type    | Null | Key | Default    | Extra 
+-------------+------------------+------+-----+---------------------+----------- 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_incre 
| id_world | int(11)   | NO |  | NULL    | 
| key   | varchar(255)  | NO |  | NULL    | 
| name  | varchar(255)  | NO |  | NULL    | 
| description | varchar(255)  | NO |  | NULL    | 
| level  | int(11)   | NO |  | 0     | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 | 
+-------------+------------------+------+-----+---------------------+----------- 
8 rows in set (0.00 sec) 

mysql> show columns from table_2; 
+--------------+------------------+------+-----+---------------------+---------- 
------+ 
| Field  | Type    | Null | Key | Default    | Extra 
     | 
+--------------+------------------+------+-----+---------------------+---------- 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_incr 
| key   | varchar(255)  | NO |  | NULL    | 
| level  | int(11)   | NO |  | NULL    | 
| name   | varchar(255)  | NO |  | NULL    | 
| description | varchar(255)  | NO |  | NULL    | 
| price  | int(11)   | NO |  | NULL    | 
| amount  | int(11)   | NO |  | NULL    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 | 
+--------------+------------------+------+-----+---------------------+---------- 
30 rows in set (0.00 sec) 

我想所有领域“,从TABLE_2其中table_2.key = table_1.key AND table_2.level = 10“这是我的模型中hasMany选项的正确方法吗?

我正常的查询如下所示:

SELECT A.key AS p_key, 
     A.name AS p_key, 
     A.description AS p_desc, 
     A.level AS p_level, 
     B.key AS r_key, 
     B.level AS r_level, 
     B.name AS r_name, 
     B.description AS r_desc 
FROM 
     table_1 AS A, 
     table_2 AS B 
WHERE 
     B.key = A.key AND 
     B.level = '1' 
+0

使用Eloquent关系与非唯一字段作为键可能会导致意外的行为。你不应该那样做。 – 2014-09-04 21:45:43

回答

4

要使用这些表来构建hasMany的关系,你需要先创建两个模型,例如:

class TableOne extends Eloquent { 

    protected $table = 'table_1'; 

    public function tableTwoItems() 
    { 
     return $this->hasMany('TableTwo', 'table_2.key', 'table_1.key') 
        ->where('table_2.level', 1); 
    } 
} 

class TableTwo extends Eloquent { 

    protected $table = 'table_2'; 
} 

一旦你创建了这些模型你的app/models目录,那么你可以使用这样的事情:

$result = TableOne::with('tableTwoItems')->get(); 

要选择的项目/场,你可以使用这样的事情:

$result = TableOne::with(array('tableTwoItems' => function($query){ 
    $query->select('table_2.key as k2', 'table_2.name as name2', 'more...'); 
}))->select('table_1.key as k1', 'table_1.name as name1', 'more...')->get(); 

您可以访问它们喜欢:

$result->first()->tableTwoItems->first(); 

或者你可以循环$result,你也可以循环使用的相关项目嵌套循环。例如:

foreach($result as $tableOneItem) 

    echo $tableOneItem->name; 

    foreach($tableOneItem->tableTwoItems as $tabletwoItem) 

     echo $tabletwoItem->name; 

    endforeach; 

endforeach; 

尝试在这两个表的key使用不同的字段名,使他们独特的为好。有关更多信息,请阅读Eloquent Relation文档。

+0

1您不需要在'hasMany'定义中使用前缀字段'table_1.key'。 2你的第二个例子'with() - > select()'是错误的,请记住这些表没有被加入,所以它会导致'unknown column'错误。 3你不需要为关系使用'PK',在这种情况下,它不是表的'PK',也不是唯一的 - 请参阅我对该问题的评论。 – 2014-09-04 21:49:11

+0

感谢队友@JarekTkaczyk_deczo_,我已经更新了答案,我不确定我是如何犯这个错误的:-) – 2014-09-04 21:56:14

+1

我也没有,可能你只是需要一杯咖啡或什么;) – 2014-09-04 22:08:55