Laravel 与自定义方法的关系

Posted

技术标签:

【中文标题】Laravel 与自定义方法的关系【英文标题】:Laravel relationship with custom method 【发布时间】:2019-03-22 02:14:29 【问题描述】:

表项目:

project_id (int)
requestor_id (uuid)

表请求者:

requestor_id (uuid)

模型项目:

public function requestor() 
    return $this->hasOne('App\Models\Requestor', 'requestor_id', 'requestor_id');

模型请求者有一种方法:

// this method return object users info from ldap
public function getLdapAttribute() 
    $ldapWrapper = new LdapWrapper();
    return $ldapWrapper->checkIfUuidExists($this->requestor_id, true);

选择所有具有请求者关系的项目:

$query = (new Project)->newQuery()->with(['requestor'])->get();

问题是: 如何选择所有具有请求者关系的项目以及在每个请求者对象调用方法 getLdapAttribute 并将所有项目作为一个对象返回?

非常感谢:)

【问题讨论】:

您的任何代码与 sql 有什么关系?? 【参考方案1】:

您可以将“Ldap”属性的名称放在 App\Requestor 类的 $appends 数组中,Eloquent 会自动将名为 ldap 的属性附加到 getLdapAttribute 方法返回的值中。

Link to the Official Laravel Documentation for this Eloquent feature !

【讨论】:

【参考方案2】:

由于没有指定getLdapAttribute方法的SQL查询,我们可以先获取项目,然后迭代获取该属性。

如果给出getLdapAttribute的SQL查询,那么我们可以在一个查询中获取所有数据(这里我们在获取项目的第一个查询之后获取属性)。

$projects = Project::with(['requestor'])
->get()
->each(function ($project) 
    $project->requestor->getLdapAttribute();
);

【讨论】:

是的,我首先使用了这个解决方案,但上面的 Diego 提出了更好的建议 :) 但也谢谢你。

以上是关于Laravel 与自定义方法的关系的主要内容,如果未能解决你的问题,请参考以下文章

init方法的重写与自定义

WebSocketChannelException: HandshakeException - Flutter 应用程序与自定义服务器上的 Laravel Websockets 使用 Cpanel 验

异常类方法与自定义异常

CSS - 原始与自定义样式表 - 覆盖样式的正确方法

Android控件架构与自定义控件详解——自定义View

js的匿名函数与自定义函数