Laravel雄辩关系的技巧

Laravel的优势之一是其优雅的语法。 如果您在Laravel中有很多模型和关系(由于数据库中有很多表),则遍历通常会以不太优美的代码结尾。 随着时间的流逝,三个小扩展已经为我证明了自己,我在下面简要介绍一下。 我们只使用一些继承,魔术方法和自定义集合。


首先,我们在app \ ConvenienceModel.php下创建一个新模型:

b45e29b9125c2ab565b5526442437686

然后,让所有模型都从新的ConvenienceModel继承:

b45e29b9125c2ab565b5526442437686

将自己的功能与关系混合在一起

如果要连接模型,请使用标准语法来调用它们:

b45e29b9125c2ab565b5526442437686

如果现在添加自己的业务逻辑,那么您将喜欢使用(小写的)驼峰表示法:

b45e29b9125c2ab565b5526442437686

我们要标准化两个变体的语法。 为此,我们将魔术方法__call添加到ConvenienceModel:

b45e29b9125c2ab565b5526442437686

因此,在上面的示例中也可以进行此调用:

b45e29b9125c2ab565b5526442437686

检查空物体

如果要将国家名称输出到某人的地址,通常会看到以下代码:

b45e29b9125c2ab565b5526442437686

为了防止这种情况,我们包括的StringHelper图书馆和返回的空类的特殊对象,如果没有找到一个模型:

b45e29b9125c2ab565b5526442437686

这也使呼叫成功(在此示例中,如果找到了内容,则输出国家/地区的名称,在所有其他情况下为空字符串)。

b45e29b9125c2ab565b5526442437686

如果我们也想解决ID 42用户甚至不存在的情况,我们还将为此构建一个小的辅助函数。:

b45e29b9125c2ab565b5526442437686

因此,即使用户根本不存在,以下调用也会传递一个空字符串:

b45e29b9125c2ab565b5526442437686

方便地遍历n:m关系

最后,我们要简化以下代码:

b45e29b9125c2ab565b5526442437686

为此,我们使用自定义集合的可能性。 我们首先扩展便利模式:

b45e29b9125c2ab565b5526442437686

然后,我们创建文件app \ Helpers \ ConvenienceCollection.php应用程序,以确保调用集合中的未知函数对集合中的所有项目执行该函数。:

b45e29b9125c2ab565b5526442437686

因此,我们可以使用以下代码输出此人所有父母的所有地址的所有国家/地区的所有名称:

b45e29b9125c2ab565b5526442437686

但是也可以进行如下调用:

b45e29b9125c2ab565b5526442437686

按多列排序

以下调用仅按位置排序,尽管这可能不是您想要的:

b45e29b9125c2ab565b5526442437686

我们正在扩展ConvenienceCollection以启用按多列排序:

b45e29b9125c2ab565b5526442437686

这样我们可以根据几个列对集合进行排序:

b45e29b9125c2ab565b5526442437686

标准分类

我们正在用另一个辅助功能扩展ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

现在,您可以为每个模型提供单独的标准排序功能:

b45e29b9125c2ab565b5526442437686

所以我们可以用:

b45e29b9125c2ab565b5526442437686

对象名称

每个模型都实现getLabel方法(getName随模型而异):

b45e29b9125c2ab565b5526442437686

这样,您可以快速轻松地输出对象的名称。 然后,您可以在ConvenienceCollection中实现sortByLabel帮助器方法:

b45e29b9125c2ab565b5526442437686

空结果

如果中间步骤为空,则Laravel函数first()和last()通常返回零。 因此,我们引入了getFirst()和getLast(),以便以下调用始终成功:

b45e29b9125c2ab565b5526442437686

有了这个,我们送回__x识别的__empty_helper:

b45e29b9125c2ab565b5526442437686

背部