Laravel 两个型号,两个字段,返回首选项(如果存在)

Laravel 两个型号,两个字段,返回首选项(如果存在),laravel,laravel-5,Laravel,Laravel 5,一直在为如何以最优化的方式实现这一目标而苦苦挣扎 我有两种型号:Catalog和Application Catalog有一个名为name的字段 应用程序有一个名为名称的字段 两者都有关系 我正在努力寻找一种方法来创建一个可以在我的Laravel应用程序中使用的函数,我会将application.id传递给它,它会根据以下逻辑返回一个$app->name值: 如果存在$application->name,请将此值用作$application对象的$app->name 否则,获取$catalog-

一直在为如何以最优化的方式实现这一目标而苦苦挣扎

我有两种型号:
Catalog
Application

Catalog
有一个名为
name
的字段

应用程序
有一个名为
名称
的字段

两者都有关系

我正在努力寻找一种方法来创建一个可以在我的Laravel应用程序中使用的函数,我会将
application.id
传递给它,它会根据以下逻辑返回一个
$app->name
值:

  • 如果存在
    $application->name
    ,请将此值用作
    $application
    对象的
    $app->name
  • 否则,获取
    $catalog->name
    值并将其用作
    $app->name
请注意,我想创建一个组件
@application()
,在这里我可以简单地传递
$application->id
,并在其中构建显示逻辑(主题/样式)

由于我在很多地方显示这个
$app->name
,所以我希望它尽可能轻量级,以避免不必要的查询


我希望这是有意义的!可能有太多的方法可以使用它,我不知道该怎么做:(

我不完全确定是否理解您的model/DB设计,但您可以使用自定义助手在整个应用程序中使用该功能

为此,您可以在
app/Http/Helpers
文件夹或您想要的任何位置创建一个简单的PHP类
Helper.PHP
文件


然后在任何控制器或视图中,您只需执行以下操作
getAppName($application->id)

不要忘记将助手文件添加到composer自动加载中。因此,在Laravel的根文件夹中的
composer.json
中,将助手路径添加到自动加载数组中:

"files": [
    "app/Http/Helpers/helpers.php"
],
最后但并非最不重要的一点是,运行以下命令:
composer转储自动加载


请注意,函数逻辑仅用于示例目的,因为我不知道您的模型结构。

在我看来,我关心数据库成本

使用三元表达式将是优雅的,但若应用程序名为空,则需要两倍于数据库的IO开销

$app\u name=Application::find($id)->name;
$app_name=empty($app_name)?Catalog::where('application_id',$id)->first()->name;
这将更加复杂,但目录查询只在
应用程序时执行。name
空时执行,它在数据库中执行,结果只取出一次

数据库将只从一个表或两个表中查找名称

大概是这样的:

$catalog\u query=catalog::where('catalogs.application\u id',$id)->select('catalogs.name')->groupBy('catalogs.name');
//如果目录和应用程序的关系为1:1,则使用->限制(1)或删除groupBy('name')更好。
应用程序::其中(“applications.id”,$id)
->选择raw(“如果(application.name为NULL或application.name=”,(“$catalog\u query->toSql()”),applications.name)作为app\u name”)
->合并绑定($catalog\u query->getQuery())
->第一()
->应用程序名称;

希望这会对您有所帮助。

谢谢!缓存此
$catalog
调用有意义吗?这取决于目录更新的频率。请记住,如果模型发生更改,缓存的查询需要清除。尽管您使用的是文件或数据库,但您仍需要执行
忘记
刷新
一次n更新完成。同样,返回目录的查询也会稍微复杂一些,因为如果目录不存在,则会从缓存或数据库中检索信息。这确实有帮助。我很感激。我真的在尽可能保持我正在构建的内容的效率。谢谢!