【问题标题】:Get table records except the ones that has foreign key values in another table获取表记录,除了在另一个表中具有外键值的记录
【发布时间】:2020-07-10 22:05:40
【问题描述】:

我有两张桌子:

goods:  id | name

imported_goods: id | good_id | amount

imported_goods 具有来自表 goods 的外键值,而我正在尝试做的是:

显示所有货物记录除了有国外的记录 imported_goods 中的关键值。

示例 (CSV):

商品

1,orange
2,apple
3,bannana
4,mango

进口商品

1,1,20 kg
2,2,40 kg
3,3,60 kg

预期结果:

4,mango

所有其他记录都被丢弃

好模特

class Good extends Model
{        
     /**
     * Get the Imported Goods for this Good.
     */
    public function imported_goods()
    {
        return $this->hasMany('App\Models\Imported_good','good_id');
    }
}

Imported_Good Model

class Imported_good extends Model
{
    /**
     * Get the Good info for this Imported Good.
     */
    public function good()
    {
        return $this->belongsTo('App\Models\Good','good_id');
    }
}

【问题讨论】:

标签: php sql laravel eloquent


【解决方案1】:

如果您遵循表名、模型名、键、字段等 (like here for example) 之间命名约定的良好做法和建议,您可以这样做:

// Parent.php model 
public function children()
{
    return $this->hasMany(Child::class);
}

// than somewhere in controller
$parents = Parent::doesntHave('children')->get();

这是一个通用示例。如果您共享实际名称和模型类代码作为表结构而不是一些 x/y 占位符,我将能够为您的特定情况提供更多信息。

【讨论】:

  • 我添加了真实的表名和列以及它们受人尊敬的模型和关系,我使用 XY 只是为了让它更简单而不是太复杂.
  • 不,我没有有效的方法来测试它,但我会稍后尝试,看看它是否有效。
  • 我几乎可以肯定它可以从您显示的代码中工作。如果没有,请告诉我。
【解决方案2】:

您可以使用子查询:

SELECT * FROM X WHERE id NOT IN (SELECT x_id FROM Y);

或者您可以执行连接:

SELECT X.* FROM X LEFT JOIN Y ON X.id = Y.x_id WHERE y.x_id IS NULL;

如果您不必担心性能,我建议您使用第一个选项(它更具可读性且更易于理解)。如果需要,请考虑joins are generally faster than subqueries

【讨论】:

  • 是否可以使用 Eloquent 模型?
  • 当然。只需遵循 subqueriesjoins 的语法即可。
猜你喜欢
  • 2014-03-23
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多