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更新完成。同样,返回目录的查询也会稍微复杂一些,因为如果目录不存在,则会从缓存或数据库中检索信息。这确实有帮助。我很感激。我真的在尽可能保持我正在构建的内容的效率。谢谢!