Pippo's avatar
Level 2

Advanced Has One Of Many and SQLSTATE[42000] error, with MariaDb

I've set a relation Has One Of Many in 'advanced way', it's almost identical to the example on Laravel site (eloquent-relationships#advanced-has-one-of-many-relationships).

class DocumentType extends Model
{
    use HasFactory, SoftDeletes;

	// Some other code here...

	public function currentRevision () {

		return $this->hasOne(DocumentTypeRevision::class, 'document_type_id')
					->ofMany (['revision_number' => 'max', 'revision_date' => 'max'], function ($qry) {
						$qry->where('revision_date', '<=', now()->startOfDay());
					});
	}
}

When i use:


$revision= DocumentType::find(1)->currentRevision;

i get the error.

The problem is that the generated SQL contains some fields in SELECT section that are not present in GROUP BY section, so the error SQLSTATE[42000]. I've found a temporary solution which is to disable 'ONLY_FULL_GROUP_BY' option in the database connection (database.php) but I would like to avoid the root problem.

Here the generated SQL for currentRevision:

select `document_types_revisions`.* 

from `document_types_revisions` 

inner join (

	select MAX(`document_types_revisions`.`id`) as `id_aggregate`, 
		   `document_types_revisions`.`revision_date` as `revision_date_aggregate`, 
      	   `document_types_revisions`.`revision_number` as `revision_number_aggregate`, 
		   `document_types_revisions`.`document_type_id` 
	   
    from `document_types_revisions` 
	
	inner join (
	
		select max(`document_types_revisions`.`revision_date`) as `revision_date_aggregate`, 
		       `document_types_revisions`.`revision_number` as `revision_number_aggregate`, 
			   `document_types_revisions`.`document_type_id` 
			   
	   from `document_types_revisions` 
	   
	   inner join (
	   
			select max(`document_types_revisions`.`revision_number`) as `revision_number_aggregate`, 
			       `document_types_revisions`.`document_type_id` 
			
			from `document_types_revisions` 
			
			where `revision_date` <= '2023-03-08 00:00:00' 
			  and `document_types_revisions`.`document_type_id` = 3 
			  and `document_types_revisions`.`document_type_id` is not null 
			  and `document_types_revisions`.`deleted_at` is null 
			  
		    group by `document_types_revisions`.`document_type_id`
			
		) as `currentRevision` on `currentRevision`.`revision_number_aggregate` = `document_types_revisions`.`revision_number` 
		                      and `currentRevision`.`document_type_id` = `document_types_revisions`.`document_type_id` 
							  
	    where `revision_date` <= '2023-03-08 00:00:00' 
		  and `document_types_revisions`.`deleted_at` is null 
		  
	    group by `document_types_revisions`.`document_type_id`
		
	) as `currentRevision` on `currentRevision`.`revision_date_aggregate` = `document_types_revisions`.`revision_date` 
	                      and `currentRevision`.`revision_number_aggregate` = `document_types_revisions`.`revision_number` 
						  and `currentRevision`.`document_type_id` = `document_types_revisions`.`document_type_id` 
						  
	where `revision_date` <= '2023-03-08 00:00:00' 
	  and `document_types_revisions`.`deleted_at` is null 
	  
    group by `document_types_revisions`.`document_type_id`
	
) as `currentRevision` on `currentRevision`.`id_aggregate` = `document_types_revisions`.`id` 
                      and `currentRevision`.`revision_date_aggregate` = `document_types_revisions`.`revision_date` 
					  and `currentRevision`.`revision_number_aggregate` = `document_types_revisions`.`revision_number` 
					  and `currentRevision`.`document_type_id` = `document_types_revisions`.`document_type_id` 
					  
where `document_types_revisions`.`document_type_id` = 3 
  and `document_types_revisions`.`document_type_id` is not null 
  and `document_types_revisions`.`deleted_at` is null 
  
limit 1;

Thanks to whoever can help me

0 likes
0 replies

Please or to participate in this conversation.