【问题标题】:Laravel Eloquent Relationship without key没有密钥的 Laravel 雄辩关系
【发布时间】:2019-04-03 18:38:51
【问题描述】:

我如何在 eloquent 中急切地加载另一个模型?关系并不完全是传统意义上的关系,而是一种要求。

我有一个users 表和一个target_types 表。每个user 都将拥有相同的target_types。所以无论target_types 出现在target_types 表中,都将适用于所有users。所以不需要外键类型的关系。

我意识到我可以沿着查询构建器路线走,但理想情况下我希望能够执行以下操作:

User::with('target_types')->get();

有什么想法吗?

【问题讨论】:

  • 为什么不直接返回一个单独的集合target_types,而不是强制一个不存在的关系?
  • 你能举个例子吗?另外,如果我可以使上述工作例如,我希望能够使用嵌套的急切加载。 User::with('target_types.other_related_data')->get();
  • 我的意思是,放入不同的变量。 $users 将是用户的集合,$targetTypes 是目标类型的集合。看来你不需要这种关系。

标签: php laravel eloquent relationship


【解决方案1】:

正如Felippe Duarte 建议的那样,您可以返回到您的视图/API 两个集合:$users$targetTypes

app/Http/Controllers/SomeCoolController.php

public function index(Request $request)
{
    // get your users
    $users = User::all();
    // get your target types
    $targetTypes = TargetType::all();


    // return them to your front-end
    return response([
        'data' => [
            'users' => $users,
            'target_types' => $targetTypes
        ]
    ], 200);

    // or in case you have a view
    // return view('my_cool_view', ['users' => $users, 'targetTypes' => $targetTypes]);

}

另类

您说targetTypes 对于所有用户都是相同的。如果这种类型不经常改变。为什么不将它们存储在模型中?

app/User.php

public function getTargetTypesAttribute()
{
    return ['my', 'list', 'of, 'target', 'types'];
}

那么您可以在查询用户时使用它:

$user = User::first();
dd($user->target_types);
// this will output the list of target types.

【讨论】:

  • 抱歉,我错过的一个细节是我正在创建一个 API(而不是传递给视图),因此在查询用户时数据需要以 JSON 属性的形式呈现。
  • @Steviewevie 我已经更改了控制器中的返回类型,还包括了一个替代方案。
【解决方案2】:

您可以像这样“伪造”用户模型中的关系:

//in User model
public function targetTypes(){

    return TargetType::where("deleted_at", "<>", "NULL");

}

然后您可以像这样在控制器中与用户一起调用它:

User::with('targetTypes')->get();

【讨论】:

  • 这就是为什么我说“你可以伪造它”,哈哈
  • 所以,之所以如此,是因为关系返回一个 Eloquent 集合,您可以在该集合上调用其他 Eloquent 查询(例如 where())。模型不知道,这不是常规关系。
  • 我刚刚意识到,如果 TargetType 模型有不同的约束,这不起作用,在我的例子中,确实如此。
  • 这是什么约束?
猜你喜欢
  • 2018-04-13
  • 2015-03-14
  • 2018-11-28
  • 2015-01-11
  • 2021-06-03
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多