gpt4 book ai didi

php - 如何根据查询的结果执行/返回查询的一部分(使用 Eloquent 或原始 SQL)?

转载 作者:行者123 更新时间:2023-11-28 23:25:59 25 4
gpt4 key购买 nike

我正在尝试根据页面的 slug(标识符)和设置的语言环境/语言获取页面的内容。但是,如果该页面在具有所选语言环境的数据库中不可用,我想返回具有后备语言环境的页面,该语言环境应该始终可用(如果不可用,则返回错误)。

对于我的应用,我使用的是 Laravel 的 Eloquent ORM。

“页面”表中的数据(伪代码):

- entry 1:
title: About
slug: about
locale: en
content: the content of the about page

- entry 2:
title: Informatie
slug: about
locale: nl
content: De tekst van de informatie pagina

- entry 3:
title: Home
slug: home
locale: en
content: The content of the home page

期望的输出(使用 fallback locale = en):

Required return to set $page to:

if the selected locale = nl, slug = about:
'entry 2'
if the selected locale = en, slug = about:
'entry 1'
if the selected locale = nl, slug = home:
(since the nl-page is not available for this slug)
set $page to 'entry 3'

这是我写的代码:

<?php
... other code ...

//based on selection
$slug = 'something';
$locale = 'the selected locale';

//setting for fallback Locale
$fallbackLocale = 'en';

//first try to get the page with the selected locale
$page = Page::where([
'slug' => $slug,
'locale' => $locale
])
->first();

// if the first query is empty, get the page with the fallback Locale
if (empty($page))
{
$page = Page::where([
'slug' => $slug,
'locale' => $fallbackLocale
])
->firstOrFail();
}

如您所见,虽然我正在执行两个查询,但这段代码确实有效。我想执行一个查询,它检查查询的前半部分是否返回某些内容(具有所选语言环境的页面),如果这是空的,则查找具有后备语言环境的页面(slug 仍然是相同的)。

有没有办法用 Eloquent 做到这一点?(我不这么认为,Eloquent 中带有“if”语句的方法是用来检查是否设置了表单中的参数,而不是检查查询是否返回了某些东西)

如果用 Eloquent 做不到,那么只用普通的 SQL 就可以吗?

最佳答案

如果您同时选择两者并按 locale = 'en' 排序,将首先选择 'nl' 因为 'nl' = 'en'0'en' = 'en'1

$page = Page::where('slug', $slug)
->whereIn('locale', [$locale, $fallbackLocale])
->orderByRaw("locale = '$fallbackLocale'")
->first();

这里的问题:如果$fallbackLocale来自用户输入,则不是注入(inject)保存。而且我没有找到在 orderByRaw() caluse 中使用占位符的方法。

但是您可以使用带有占位符的原始查询:

$page = Page::hydrateRaw("
select *
from pages
where slug = ?
and locale in (?, ?)
order by locale = ?
limit 1
",
[$slug, $locale, $fallbackLocale, $fallbackLocale]
)->first();

更新:

我找到了一种在 orderByRaw() 中使用占位符的方法:

$page = Page::where('slug', $slug)
->whereIn('locale', [$locale, $fallbackLocale])
->orderByRaw("locale = ?")
->addBinding($fallbackLocale, 'order')
->first();

关于php - 如何根据查询的结果执行/返回查询的一部分(使用 Eloquent 或原始 SQL)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com