2 回答
TA贡献1810条经验 获得超5个赞
您可以使用 Eloquent 来实现此目的,而不是使用左连接和数据库外观。
我猜公司和Logo之间的关系是1:1或1:n。如果我们假设它是 1:1 那么你的查询将如下所示:
Company::whereHas('logo', function($query) {
return $query->where('date', '<', Carbon::now()->subDays(90));
})->orWhereDoesntHave('logo')->...
您应该检查:查询关系缺失
只要我们遵循 Laravel 命名约定,我们就不需要指定表名,Laravel 会从模型名称中找出它。
标志模型应该是这样的:
class Logo extends Model
{
// protected $table = 'logos';
// not necessary, Laravel already knows to use logos table
protected $guarded = ['id'];
public function company()
{
// return $this->belongsTo(Company::class, 'companies_id');
// no need to specify foreign key if we follow naming convention
// foreign key should be {foreign_model_singular}_id
// in this case it is company_id
return $this->belongsTo(Company::class);
}
}
Company 模型也不需要指定表名,它已经知道它应该是Companies。
公司模式:
class Company extends Model
{
// protected $table = 'companies';
protected $guarded = ['id'];
public function logo()
{
return $this->hasOne(Logo::class);
}
}
请检查 $guarded 和 $fillable 属性如何工作。如果只有id设置为受保护,则所有其他属性均不受保护,不确定这是否是您的意图。
完整的查询应该是:
Company::whereHas('logo', function($query) {
return $query->where('updated_at', '<', Carbon::now()->subDays(90));
})->orWhereDoesntHave('logo')
->orderBy('name', 'ASC')
->get();
TA贡献1770条经验 获得超3个赞
->whereDate('logos.updated_at' whereDate 仅比较 dateTime 列的日期部分 ... 尝试使用 Carbon 的 toDateString() ...
$symbolsWithoutLogos = DB::table('companies')
->leftJoin('logos', 'companies.id', '=', 'logos.companies_id')
->whereDate('logos.updated_at', Carbon::now()->subDays(90)->toDateString())
->whereNull('companies.logo_image')
->orderBy('name', 'ASC')->select('companies.*')
->get();
- 2 回答
- 0 关注
- 120 浏览
添加回答
举报