php - 获取与 Eloquent Laravel 的 hasMany 关系

标签 php mysql laravel model eloquent

我有两个带有此 schmea 的表:

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)

我想获取“from table_2 where 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'

最佳答案

要使用这些表构建 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;

尝试在两个表的中使用不同的字段名称,并使其唯一。阅读Eloquent Relation更多文档。

关于php - 获取与 Eloquent Laravel 的 hasMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25672069/

相关文章:

mysql - 使用 mysql crate 时如何将 MySQL 枚举转换为 Rust 枚举?

php - 如何在 Laravel 中建立表之间的关系?

json - 如何传递JSON数据以在laravel中查看

php - Eloquent 模型事件在使用 create 时被保存和创建?

php - 在我的表 : It shows one record less 中显示记录时出错

c# - 通过服务器从 MySQL 数据库检索图像

php - 使用 Laravel 更新 : created_at is updated when updating record

php - 如何使用 pdo 发送数组以在 smarty 3.1.21 的 html_options 中使用它

php - MySQL 多表更新语句

php - 使用 PHP 配置邮件服务器