دسترسی به جدول دیتابیس دیگر با ریلیشن شیپ

- 2 روز پیش
توسط سعید محمدی آپدیت شد
سعید محمدی ( 1140 تجربه )
6 روز پیش

سلام

فرض کنیم دو تا دیتابیس داریم

تو اولی که اصلی هست جدول یوزر قرار داره با یک جدول مطالب (جدول مطالب با جدول یوزر رابطه داره از طریق فیلد user_id)

حالا فرض کنیم تو دیتابیس دوم فقط یه جدول داریم که اونم جدول مطالب هست و دارای فیلد user_id هست.

خب در دیتابیس اول به راحتی میشه از جدول مطالب و کلید خارجی user_id به جدول یوزر متصل شد و اطلاعات کاربر مربوط به اون مطلب رو خواند

سوال اینجاست چطوری همین کار رو برای جدول مطالب در دیتابیس دیگه کنیم؟

یــــــــــــــــعــــــــــــــــنــــــــــــــــی بــــــــــــــــا اســــــــــــــــتــــــــــــــــفــــــــــــــــاده از مـــــــــــــــــــــــــــــــــــدل هــــــــــــــــــــــــــــــــا

چون تو دیتابیس دوم که جدول یوزر وجود نداره و این جدول کاربران فقط تو دیتابیس اول هست

سپاس

tresa021 ( 3805 تجربه )
6 روز پیش
تخصص : Professional PHP Developer

از اولی اطلاعات user رو بدست بیار و از این اطلاعات برای دومی استفاده به شرط اینکه user_id در دومی مقدارش صحیح باشه

TEFO ( 8330 تجربه )
6 روز پیش
تخصص : لاراول

کافیه توی مدل مطالب اینجوری بنویسین مثلا اسمش رو میذاریم Topic

class Topic extends Eloquent
{

    public function users()
    {
        retrun $this->belongsToMany('App\User','database_dovom.user_id');
    }   
}

باید اسم دیتابیس (databese_dovom) رو به این شکلی کنار کلید خارجی رابطه بذارین

سعید محمدی ( 1140 تجربه )
5 روز پیش

@tefo.ha27
@hesammousavi
@ali.bayat
@khanzadimahdi
@Alimotreb

ممنون از پاسخ شما
ببینید این بخش کانفیگ دیتابیس من هست :

        'server1' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'my_db',
            'username' => '',
            'password' => '',
        ],

        'server2' => [
            'driver' => 'mysql',
            'host' => '190.47.33.10',
            'port' => '3306',
            'database' => 'my_db',
            'username' => '',
            'password' => '',
        ],

        'server3' => [
            'driver' => 'mysql',
            'host' => '130.46.44.5',
            'port' => '3306',
            'database' => 'my_db',
            'username' => '',
            'password' => '',
        ],

این مدل User هست که دیتابیسش در سرور اول قرار داره :

<?php

namespace App;

use App\Message;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    public function message() {
        return $this->hasMany(Message::class);
    }
}

این مدل Message هست که دیتابیسش در سرور دوم قرار داره :

<?php

namespace App;

use App\User;
use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    public function user() {
        return $this->belongsTo(User::class);
    }
}

چون مدل User همیشه در سرور اصلی که همون سرور 1 هست قرار داره ولی در سرور 2 و یا بعدا سرور 3 ، سرور 4 و ... قرار هست از دیتابیس مربوط به مدل Message قرار داده شود پس باید از همه مدل های مربوط به Message در سرور های مختلف به مدل User در سرور اصلی یا همان سرور 1 بتوان ارتباط برقرار کرد.

ممنون میشم الان بفرمائید نوع ارتباط رو ؟

TEFO ( 8330 تجربه )
5 روز پیش
تخصص : لاراول
class Message extends Model
{
    public function user() {
        return $this->belongsTo(User::class, 'server1.user_id');
    }
}
سعید محمدی ( 1140 تجربه )
2 روز پیش

@tefo.ha27 این کدی هم که قرار دادم کار نکرد لطفا کمک کنید ممنون

از شما هم ممنون میشم یه راهنمایی کنید
@hesammousavi
@ali.bayat
@khanzadimahdi
@milad

سپاس

علی بیات ( 193487 تجربه )
2 روز پیش
تخصص : توسعه دهنده ارشد وب

خیلی منطقی نیست برای یک اپلیکیشن از دو دیتابیس استفاده کنید.. چرا تمام داده هارو در ۱ دیتابیس نمیذارید؟
این طوری راحت تمام جدول ها هم با هم در ارتباطند

TEFO ( 8330 تجربه )
2 روز پیش
تخصص : لاراول

فکر کنم اصلا از connection استفاده نکردین
https://fideloper.com/laravel-multiple-database-connections?source=post_page-----d7e8dcb7ed2a----------------------

سعید محمدی ( 1140 تجربه )
2 روز پیش

@ali.bayat خواسته من این نیست که شما بفرمائید که چرا دارم از دو الی چندین دیتابیس استفاده میکنم هدف من ارتباط یه جدول خارجی در دیتابیس خارجی با جدول اصلی در دیتابیس اصلی می باشد.

اگر در این مورد راه حلی دارید ممنون میشم ارائه بدید

علی بیات ( 193487 تجربه )
2 روز پیش
تخصص : توسعه دهنده ارشد وب

راه حل اون رو که @tefo.ha27 توضیح دادند.

سعید محمدی ( 1140 تجربه )
2 روز پیش

@ali.bayat اون چیزی که @tefo.ha27 زحمت کشیدن و ارائه دادن رو هم تست کردم ولی جواب نداد متاسفانه!

منظورم اینه :

class Message extends Model
{
    public function user() {
        return $this->belongsTo(User::class, 'server1.user_id');
    }
}

و اخطار زیر رو داد :

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'server3.users' doesn't exist (SQL: select * from `users` where `messages`.`id` in ())

یه بار دیگه توضیح بدم شاید بهتر بتونم مسئله رو بیان کنم تا دوستان راه حل ارائه بدن:
ببینید من فقط یک اسکریپت لاراول دارم و تمام مدل ها هم درون اون هستن، برای راحتی توضیح شما فرض کنید که من کلا دو تا جدول و دو تا مدل دارم

  • مدل اول مربوط به کاربران هست که جدولش users و مدلش هم User هست
  • مدل دوم هم جدول و مدل مربوط به پیام های کاربران هست که جدولش messages و مدلش هم Message هست

نکته 1 : مدل ها (هر دو مدل) در یک اسکریپت لاراول هستند (چون فقط یک اسکریپت وجود دارد)
نکته 2 : جدول messages هم در سرور اصلی (یعنی سرور 1) و هم در چندین دیتابیس و هر دیتابیس در سرور جداگانه می باشد.
مثلا :
Server1.mydb.messages
Server2.mydb.messages
Server3.mydb.messages
Server4.mydb.messages
و
...
نکته : حالا هدف من اینه تو اسکریپت لاراول وقتی لیست پیام ها رو میخام ببینم ابتدا انتخاب میکنم این پیام ها از کدوم جدول در کدوم دیتابیس و کدوم سرور میخوام لیست بشه و نمایش داده بشه که تا اینجا هیچ مشکلی وجود نداره و نمایش داده میشه
فقط مشکل اصلی بحث join و تابع with() هست که درست کار نمیکنه و فقط در دیتابیس اول درست کار میکنه چون توی دیتابیس اول جدول messages هم وجود داره و جدول users هم وجود داره
ولی تو سرور های دیگه فقط هر کدوم یه جدول دارن و اون هم messages هست و همه ی اونها باید باید با جدول users که فقط تو دیتابیس سرور شماره 1 هست رابطه برقرار کنند تا ببینم این پیام مربوط به کدام کاربر هست.
که وقتی جدول messages از سرور ها 2 و 3 و 4 و ... لیست میشن میخوام ببینم کاربرش چه کسی هست ارتباط برقرار نمیشه حتی با کدی که جناب @tefo.ha27 ارائه دادن

میخام به مدل Message بگم که اطلاعات کاربر فقط تو یه سرور هست اونم فقط سرور 1 هست و نباید دنبال جدول users تو سرور های 2 و 3 و 4 و ... بگرده ولی نمیدونم چطوری!

این کانفیگ دیتابیس من هست که تو پروژه اصلی لاراول هست که جدول users هم فقط همینجاست:

 'server1' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'mydb',
            'username' => '',
            'password' => '',
        ],

        'server2' => [
            'driver' => 'mysql',
            'host' => '190.47.33.10',
            'port' => '3306',
            'database' => 'mydb',
            'username' => '',
            'password' => '',
        ],

        'server3' => [
            'driver' => 'mysql',
            'host' => '130.46.44.5',
            'port' => '3306',
            'database' => 'mydb',
            'username' => '',
            'password' => '',
        ],

        'server4' => [
            'driver' => 'mysql',
            'host' => '177.50.88.15',
            'port' => '3306',
            'database' => 'mydb',
            'username' => '',
            'password' => '',
        ],

این مدل User هست که دیتابیسش فقط و فقط در سرور اول قرار داره :

<?php

namespace App;

use App\Message;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    public function message() {
        return $this->hasMany(Message::class);
    }
}

این مدل Message هست که مربوط به جدول messages هست که از این جدول در دیتابیس های همه ی سرور ها (سرور 1 و سرور 2 و سرور3 و سرور 4 و ...) قرار داره :

<?php

namespace App;

use App\User;
use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    public function user() {
        return $this->belongsTo(User::class);
    }
}

حالا ممنونم میشم دوستان لطفی کنند و یه راه حل مناسب ارائه بدهند :
@tefo.ha27
@hesammousavi
@ali.bayat
@khanzadimahdi
@Alimotreb

ســــــــــــــــــــــــپـــــــــــــــــــاس

TEFO ( 8330 تجربه )
2 روز پیش
تخصص : لاراول

مدل ها به صورت پیش فرض فقط با دیتابیسی که توی فایل env هست ارتباط برقرار میکنه اگه میخاین اونو عوض کنین یا با متد setConnection رو ابجکت
یا اینکه توی مدل اتریبیوت connection رو عوض کنین
اینجا اصلا باید خودتون راه حلو پیدا کنین که چجوری تشخیص میدین اون user_id کجاست
این کد من معلومه ناقصه

class Message extends Model
{
    public function user() {
        return $this->belongsTo(User::class, 'server1.user_id');
    }
}

چون اصلا توی سرور یک اصلا یوزر ایدی نداریم من اینو فقط بعنوان مثال عرض کردم چجوری سرور رو عوضش میکنین تنها کاری که باید بکنین اینه
server1.user_id
این server1 رو یه جوری به مدلتون پاس بدین
یا از لینک بالا استفاده کنین برای تعیین کانکشن
برای همین اقای @ali.bayat گفتن اصولی نیست یه مدل توی چند دیتابیس باشه

سعید محمدی ( 1140 تجربه )
2 روز پیش

@tefo.ha27 خب مدل که یکی هست اگه توضیحات و خونده باشین همه چی معلومه الان من نیاز به یه حواب دارم که تو اون مدل Message
همیشه فانکشن مربوط به user ارتباط رو با با مدل یوزر سرور ۱ برقرار کنه
یعنی اینکه تابع user در مدل Message باید کانکشن رو فقط به سرور ۱ وصل کنه

برای ارسال پاسخ باید وارد سایت شوید