[LARAVEL] HAS()

Pagina: 1
Acties:

Vraag


  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10-2025
Mijn vraag
Op mijn werk zijn wij een Portal aan het bouwen. Deze moet voor verschillende gebruikers een template genereren met vragen en dit valideren en generiek opslaan. Dit werkt! :D Nu willen wij tussen de vragen HTML elementen laden zoals <hr> of labels met tekst. Hier loop ik vast.

Ik heb in table (zie foto) questions_templates_XREF een question_ID OF een template_element_ID.
als question_ID leeg is maar template_element_ID niet dan moet de SQL/Laravel die relatie returnen. Dat lukt dus niet want ik zie alleen wat ik altijd zie maar een leeg template_element veld...

Afbeeldingslocatie: https://i.ibb.co/68wxYrg/90-FF0-DFC-269-E-4-D19-AFB2-71-C05-DA01-A50-png.jpg

Relevante software en hardware die ik gebruik
MS SQL, Laravel 5,7

Wat ik al gevonden of geprobeerd heb
Ik heb meerdere manieren geprobeerd.
Zoals:
https://laravel.com/docs/...#constraining-eager-loads


Zou super zijn als iemand het weet!! ik zit hier al 2 weken op te kopstoten |:(

Bij voorbaat dank :)


PHP:
1
2
3
// Dit heb ik nu en werkt zonder de elementen
$view->template = Question_Template::with('questionsPivot', 'validations')
            ->findOrFail($id);


PHP:
1
2
3
// Dit is met HAS() voor de left join want die heb ik dus nodig... 
$view->template = Question_Template::with('questionsPivot', 'validations')->has('template_elements', 'questions_templates_XREF.elements_ID')
            ->findOrFail($id);

ERROR
SQL:
1
2
3
4
5
6
7
8
9
SQLSTATE[22018]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Conversion failed when
converting the nvarchar value 'questions_templates_XREF.elements_ID' to data type int.

(SQL: select top 1 * from [questions_templates] 
where (select count(*) from [template_elements] inner join
[questions_templates_XREF] on [template_elements].[ID] = [questions_templates_XREF].[ID] 
where
[questions_templates].[ID] = [questions_templates_XREF].[template_element_ID]) =
questions_templates_XREF.elements_ID and [questions_templates].[ID] = 9)



Models
Question_Template
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Question_Template extends Model
{
    protected $fillable = ['name',];

    public $timestamps = false;
    protected $table = 'questions_templates';
    protected $primaryKey = 'ID';

    const UPDATED_AT = 'modified_at';


    public function client_class()
    {
        return $this->belongsTo(Client_Class::class);
    }

    public function questionsPivot()
    {
        return $this->belongsToMany(Question::class, 'questions_templates_XREF', 'question_template_ID', 'question_ID', '', '', '')->withPivot('step', 'ordering')->orderBy('step')->orderBy('ordering');
    }

    public function validations()
    {
        return $this->belongsToMany(Validation::class, 'questions_validations_XREF', 'template_ID', 'validation_ID')->withPivot('parameter', 'question_ID');
    }

    public function template_elements()
    {
        return $this->belongsToMany(Template_Element::class, 'questions_templates_XREF', 'template_element_ID', 'ID');
    }
}


Template_Element
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Template_Element extends Model
{
    protected $fillable = ['title', 'text', 'html'];

    protected $table = 'template_elements';
    protected $primaryKey = 'ID';

    const UPDATED_AT = 'modified_at';


    public function element()
    {
        return $this->belongsTo(Element::class);
    }
}

Beste antwoord (via Groax op 06-02-2019 11:06)


  • cratyz
  • Registratie: Maart 2014
  • Laatst online: 18-01 23:22
PHP:
1
2
3
4
5
6
7
8
9
class Question_Template extends Model
{
    ...

    public function template_elements()
    {
        return $this->belongsToMany(Template_Element::class, 'questions_templates_XREF', 'question_template_ID', 'question_ID');
    }
}


Ik zou het woord pivot weghalen voor questions en de functie gewoon `questions()` noemen.

Constraining eager loads heb je in principe niet nodig, je kunt hiermee on-the-go relaties ophalen maar meestal is het handiger om een tweede relatie aan te maken met de beperking die je nodig hebt.

Voor de SQL error: mocht die nog steeds bestaan, dan moet je denk ik aan je modellen toevoegen:
PHP:
1
2
3
4
// Cast ID to integer because Laravel expects a lowercase 'id' (in fact everything should be lowercase column names).
protected $casts = [
  'ID' => 'integer'
];


EDIT: nvm volgens mij wordt die SQL error veroorzaakt door een foutieve relatie.

[ Voor 4% gewijzigd door cratyz op 03-02-2019 12:22 ]

Alle reacties


  • Kappie
  • Registratie: Oktober 2000
  • Laatst online: 10:21

Kappie

Tell me your secrets...

Je probeert een int met een nvarchar te vergelijken. Hoe zien je migrations eruit?

Zijn [questions_templates].[ID], [questions_templates_XREF].[template_element_ID] en [questions_templates_XREF].[elements_ID] wel hetzelfde type?

He does fit the profile perfectly. He's intelligent, but an under-achiever; alienated from his parents; has few friends. Classic case for recruitment by the Soviets.


  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10-2025
Zijn allemaal type int. Daarom is het dus zo vreemd..

Verwijderd

De sql fout gaat over een elements_id in de XREF table, maar dat attribuut staat niet in je datamodel in die table. Verder is het eigenaardig dat je een lijst met meerdere ids (elementS_id) vergelijkt met een aantal. Kan natuurlijk een oaravel bug zijn, maar wat zie je in de database zelf?

Acties:
  • Beste antwoord

  • cratyz
  • Registratie: Maart 2014
  • Laatst online: 18-01 23:22
PHP:
1
2
3
4
5
6
7
8
9
class Question_Template extends Model
{
    ...

    public function template_elements()
    {
        return $this->belongsToMany(Template_Element::class, 'questions_templates_XREF', 'question_template_ID', 'question_ID');
    }
}


Ik zou het woord pivot weghalen voor questions en de functie gewoon `questions()` noemen.

Constraining eager loads heb je in principe niet nodig, je kunt hiermee on-the-go relaties ophalen maar meestal is het handiger om een tweede relatie aan te maken met de beperking die je nodig hebt.

Voor de SQL error: mocht die nog steeds bestaan, dan moet je denk ik aan je modellen toevoegen:
PHP:
1
2
3
4
// Cast ID to integer because Laravel expects a lowercase 'id' (in fact everything should be lowercase column names).
protected $casts = [
  'ID' => 'integer'
];


EDIT: nvm volgens mij wordt die SQL error veroorzaakt door een foutieve relatie.

[ Voor 4% gewijzigd door cratyz op 03-02-2019 12:22 ]


  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10-2025
cratyz schreef op zondag 3 februari 2019 @ 12:20:
PHP:
1
2
3
4
5
6
7
8
9
class Question_Template extends Model
{
    ...

    public function template_elements()
    {
        return $this->belongsToMany(Template_Element::class, 'questions_templates_XREF', 'question_template_ID', 'question_ID');
    }
}



EDIT: nvm volgens mij wordt die SQL error veroorzaakt door een foutieve relatie.
Heb ik al. ID's worden gezien als uppercase
PHP:
1
protected $primaryKey = 'ID';


En de relatie is inderdaad fout.. :( de left join lukt helaas nog steeds niet

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10-2025
De relaties waren inderdaad fout. Sla mij maar dood! deed iets en het werkte :P
Pagina: 1