[LARAVEL] HAS()

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10 11:33
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: 21-06 22:10
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


Acties:
  • 0 Henk 'm!

  • Kappie
  • Registratie: Oktober 2000
  • Laatst online: 02:24

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.


Acties:
  • 0 Henk 'm!

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

Acties:
  • 0 Henk 'm!

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
  • 0 Henk 'm!

  • cratyz
  • Registratie: Maart 2014
  • Laatst online: 21-06 22:10
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 ]


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10 11:33
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

Acties:
  • 0 Henk 'm!

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