【问题标题】:Get all keys without translations无需翻译即可获取所有密钥
【发布时间】:2021-11-21 11:44:29
【问题描述】:

我有这个实体:

class Keyword extends Model
{
    use HasFactory;

    protected $table = "keywords";

    protected $fillable = [
        'key',
        'description',
        'project_page_id'
    ];

    public function keywordsTranslated()
    {
        return $this->hasMany(KeywordTranslated::class);
    }

    public function projectPage()
    {
        return $this->belongsTo(ProjectPage::class)->withDefault();
    }
  }

还有这个:

class KeywordTranslated extends Model
{
    use HasFactory;

    protected $table = "keywords_translated";

    protected $fillable = [
        'translation',
        'language_id',
        'keyword_id'
    ];

    public function keyword()
    {
        return $this->belongsTo(Keyword::class)->withDefault();
    }

    public function language()
    {
        return $this->belongsTo(Language::class)->withDefault();
    }
}

我想获取所有keywords 没有特定languagekeywordTranslated

我试过这样:

public function searchTranslatedKeys(
    int $projectPageId,
    int $curentPage,
    int $languageId,
    string $search = null
) {
    $query = $this->model->newQuery();
    $query->where('project_page_id', $projectPageId);
    if ($search) {
        $query->where('key', 'LIKE', "%{$search}%");
    }
    $query->doesntHave('keywordsTranslated');
    $query->orderBy('id', 'DESC');

    if ($search) {
        return $query->get();
    }

    return $query->get()->forPage($curentPage, 20);
}

但在这种情况下,我的回报是空的。

例如,在关键字中我有:

id          key                description
1           addItem            description for this item
2           deleteItem         description for this item 
3           editItem           description for this item  

在 kewordTranslated 中:

translation             keyword_id                     language_id
Add item                1                               1
Add item new            1                               2
Delete item             2                               1

我想获取所有没有语言 2 的密钥,对于前面的示例,我应该收到 2 个 id = 2 和 3 的密钥,因为这些密钥没有该语言的 kewordTranslated。如果语言 id 为 1,我应该只获得 id = 3 的关键字,因为该关键字没有该语言的 kewordTranslated

【问题讨论】:

    标签: php laravel database eloquent laravel-8


    【解决方案1】:

    你可以使用whereDoesntHave

    它会根据缺乏关系限制您的结果:

    代替:

     $query->doesntHave('keywordsTranslated');
    

    你可以使用:

     $query->whereDoesntHave('keywordsTranslated',function ($query) use ($languageId) {
                $query->where('language_id','=',$languageId);
            });
    

    【讨论】:

    • 谢谢,工作中
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2017-07-22
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多