【问题标题】:Return specific data with eager load nested relationships in Laravel在 Laravel 中返​​回具有急切加载嵌套关系的特定数据
【发布时间】:2013-09-19 09:55:09
【问题描述】:

我正在使用 Laravel 4 和 MySQL 并使用关系方法来访问相关表的数据。我有以下相关表格:

团队表

id INT
partnet_id INT  -- Related many-to-one with partner table
name VARCHAR(50)

合作伙伴表

id INT
name VARCHAR(50)
-- more data about only to partners

客人桌

id INT
name VARCHAR(50)
-- more data about only to guests

成员表

id INT
partner_id INT -- Related many-to-one to partner table
guest_id INT -- Related many-to-one to guest table
team_id INT -- Related many-to-one to team table

所以,我想让一个团队(或所有团队)及其成员与客人或合作伙伴一起提供相关数据。

输出应该是这样的:

{ 
    "id": 1,
    "partner": {
        "id": 1,
        "name":"Hello world",
        "partner_number":1111,
        "handicap":12
    },
    "name":"my team,
    "members": [
        {
            "id": 1,
            "name":"Hello world",
            "partner_number":1111,
            "handicap":12,
            "type": "partner"
        },
        {
            "id": 2,
            "name": "Cat Kitten",
            "partner_number":2222,
            "handicap":12,
            "type": "partner"
        },
        {
            "id": 3,
            "name": "Bruce Wayne",
            "partner_number":3333,
            "handicap":10,
            "type": "partner"
        },
        {
            "id": 1,
            "name": "The Joker",
            "idcard":21841933,
            "handicap":10,
            "type": "guest"
        }
    ]
}

我尝试通过以下方式获得该输出:

$teams = Team::find(1);
$teams->load('partner', 'member.partner', 'member.guest');

这样我得到了所需的数据,但得到了我并不真正想要/不需要的东西:

Array
(
    [id] => 2
    [partner_id] => 2
    [name] => 'my team'
    [partner] => Array
        (
            [id] => 2
            [name] => Batman Batman
            [partner_number] => 2222
            [handicap] => 8
        )
    [members] => Array
        (

            [1] => Array
                (
                    [id] => 5           // I don't need this
                    [team_id] => 2      // I don't need this
                    [partner_id] => 3   // I don't need this
                    [guest_id] =>       // I don't need this
                    [partner] => Array
                        (
                            [id] => 3
                            [name] => Amazing Spiderman
                            [partner_number] => 3333
                            [handicap] => 12
                        )

                    [guest] =>          // I don't need this
                )

            [2] => Array
                (
                    [id] => 6           // I don't need this
                    [team_id] => 2      // I don't need this
                    [partner_id] =>     // I don't need this    
                    [guest_id] => 1     // I don't need this
                    [partner] =>        // I don't need this
                    [guest] => Array
                        (
                            [id] => 1
                            [name] => Eddard Stark
                            [idcard] => 2139823
                            [handicap] => 21
                        )

                )

        )

)

评论// I don't need this 的位置是与成员表相关的数据,但我只需要内部关系数据(合作伙伴或客人数据)。例如,如果我这样做Member::find(1)->partner,我会得到没有成员表内容的合作伙伴数据。 是否可以在 Laravel 中使用急切加载或其他方法来做类似的事情?

我知道我可以对输出进行操作和迭代,只保留必要的数据,但我只想知道是否可以不进行更多查询或执行繁重的循环。

任何提示、帮助或评论都会很有用。

【问题讨论】:

    标签: orm laravel laravel-4 eager-loading


    【解决方案1】:

    尝试在模型类中使用$visible$hidden 数组。

    来自文档:

    有时您可能希望限制包含在 您的模型的数组或 JSON 形式,例如密码。为此,添加一个 隐藏模型的属性定义:

    在数组或 JSON 转换中隐藏属性

    class User extends Eloquent {
    
        protected $hidden = array('password');
    
    }
    

    或者,您可以使用 visible 属性来定义一个 白名单:

    protected $visible = array('first_name', 'last_name');
    

    请看这里:http://four.laravel.com/docs/eloquent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2017-09-30
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多