Files
upstream-twenty/packages/twenty-docs/l/ar/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv.mdx
upstream-mirror e7da97194a
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
2026-09-17 23:28:13 +05:00

226 lines
12 KiB
Plaintext

---
title: استيراد العلاقات بين الكائنات عبر CSV
description: دليل كامل خطوة بخطوة لربط السجلات أثناء استيراد CSV.
---
## نظرة عامة
يأخذك هذا الدليل خلال استيراد العلاقات بين الكائنات—على سبيل المثال، ربط الأشخاص بالشركات، أو الفرص بالأشخاص.
<Note>**ما الذي يمكن استيراده:** العلاقات من واحد إلى متعدد التي تشير إلى نوع كائن واحد فقط. العلاقات التي تشير إلى أنواع كائنات متعددة (مثل ملاحظات مرتبطة بالأشخاص والشركات معًا) غير مدعومة للاستيراد بعد.</Note>
## فهم العلاقات
### ما هي علاقة "واحد إلى متعدد"؟
في علاقة واحد إلى متعدد:
* **شركة واحدة** لديها **العديد** من الأشخاص (الموظفين)
* **شركة واحدة** لديها **العديد** من الفرص
* **شخص واحد** لديه **العديد** من المهام
جانب "الواحد" هو **الأصل**. جانب "المتعدد" هو **التابع**.
### العلاقات الشائعة في Twenty
| علاقة | جانب "الواحد" (الأصل) | جانب "المتعدد" (التابع) |
| ------------------- | --------------------- | ----------------------- |
| الشركات → الأشخاص | الشركة | الأشخاص |
| الشركات → الفرص | الشركة | الفرص |
| الأشخاص → المهام | شخص | المهام |
| الأشخاص → الملاحظات | شخص | الملاحظات |
## الخطوة 1: تحديد جانبي "الواحد" و"المتعدد"
قبل الاستيراد، حدّد أي الكائنات هو الأصل وأيها التابع.
**اسأل نفسك:** "هل لدى كائن واحد من [Object A] العديد من [Object B]؟"
* شركة واحدة → العديد من الأشخاص ✓ (الشركة هي الأصل)
* شخص واحد → العديد من الشركات ✗ (هذا خطأ — الشخص ينتمي إلى شركة واحدة)
## الخطوة 2: استيراد سجلات الأصل أولًا
يجب أن يكون الأصل (جانب "الواحد") موجودًا في Twenty قبل أن تتمكّن من الإشارة إليه.
**ترتيب الاستيراد:**
1. **الشركات** أولًا (من دون تبعيات)
2. **الأشخاص** ثانيًا (مرتبطون بالشركات)
3. **الفرص** ثالثًا (مرتبطة بالشركات و/أو الأشخاص)
4. **المهام/الملاحظات** (مرتبطة بأي مما سبق)
<Warning>
**إذا كان سجل الأصل غير موجود، فسيفشل الاستيراد.**
تحقّق دائمًا من استيراد الشركات قبل استيراد الأشخاص الذين لديهم مراجع للشركات.
</Warning>
## الخطوة 3: تدوين المعرّف الفريد للأصل
تحتاج إلى الإشارة إلى سجل الأصل باستخدام **مُعرّف فريد**. الخيارات المتاحة:
| كائن الأصل | المُعرّفات الفريدة المتاحة |
| --------------------- | ---------------------------------------------------- |
| **الشركات** | `id` (UUID)، `domain` (موصى به)، أو أي حقل فريد مخصص |
| **الأشخاص** | `id` (UUID)، `email`، أو أي حقل فريد مخصص |
| **أعضاء مساحة العمل** | `id` (UUID)، `email` (ليس الاسم) |
| **كائنات مخصصة** | `id` (UUID)، أو أي حقل مميز كفريد |
<Note>**موصى به:** استخدم `domain` للشركات و`email` للأشخاص. هذه مقروءة للبشر وسهلة التحقّق منها في جدول البيانات الخاص بك.</Note>
### العثور على المعرّف
إذا كنت تحتاج إلى `id`:
1. صدّر سجلات الأصل من Twenty
2. يتضمن التصدير عمود `id`
3. استخدم هذه المعرّفات في ملف سجلات التابع
## الخطوة 4: التحقّق من وجود حقل العلاقة
قبل الاستيراد، تأكّد من وجود حقل العلاقة بين كائناتك.
**للتحقّق أو الإنشاء:**
1. اذهب إلى **الإعدادات → نموذج البيانات**
2. اختر كائن التابع الخاص بك (مثلًا، الأشخاص)
3. ابحث عن حقل علاقة يشير إلى الأصل (مثلًا، الشركة)
4. إذا لم يكن موجودًا، فقم بإنشائه:
* انقر **+ إضافة حقل**
* اختر نوع **العلاقة**
* اختر كائن الأصل
## الخطوة 5: جهّز ملف CSV الخاص بك
أضِف عمودًا إلى ملف CSV للتابع يشير إلى الأصل باستخدام مُعرّفه الفريد.
### مثال: ربط الأشخاص بالشركات
**ملف CSV الخاص بالأشخاص لديك:**
```csv
firstName,lastName,email,jobTitle,companyDomain
John,Smith,john@acme.com,CEO,https://acme.com
Jane,Doe,jane@widgets.co,CTO,https://widgets.co
Bob,Johnson,bob@techstart.io,Developer,https://techstart.io
```
يشير عمود `companyDomain` إلى نطاق الشركة.
### متطلبات التنسيق
| معرّف | التنسيق | مثال |
| ----------------- | ------------------- | -------------------------------------- |
| النطاق | تنسيق عنوان URL | `https://acme.com` |
| البريد الإلكتروني | بريد إلكتروني قياسي | `john@acme.com` |
| المعرف | UUID | `c776ee49-f608-4a77-8cc8-6fe96ae1e43f` |
<Warning>
**تنسيق النطاق مهم!**
استخدم `https://domain.com` (وليس فقط `domain.com`). هذا يتوافق مع طريقة تخزين Twenty لنطاقات الشركات ويمنع أخطاء المطابقة.
</Warning>
### قواعد مهمة
1. **تطابق تام مطلوب** — يجب أن تتطابق القيمة تمامًا مع سجل الأصل
2. **قم بتعيين مُعرّف فريد واحد فقط** — لا تُدرج كلًّا من `companyId` و`companyDomain`
3. **حسّاس لحالة الأحرف** — `Acme.com` ≠ `acme.com`
## الخطوة 6: ارفع الملف وعيّن العلاقة
1. انتقل إلى كائن التابع (مثلًا، الأشخاص)
2. انقر **⋮** → **Import records**
3. ارفع ملف CSV الخاص بك
4. في خطوة تعيين الحقول:
* اعثر على عمود العلاقة الخاص بك (مثلًا، `companyDomain`)
* طابقه مع حقل علاقة **Company**
5. أكمل التعيينات المتبقية
6. راجع الأخطاء وأكّد
سيقوم Twenty بربط كل سجل تابع تلقائيًا بالأصل المطابق.
## الخطوة 7: التحقّق من الاستيراد
بعد الاستيراد:
1. افتح عددًا قليلًا من سجلات التابع (مثلًا، الأشخاص)
2. تحقّق من أن حقل العلاقة يعرض الأصل الصحيح (مثلًا، الشركة)
3. افتح سجل الأصل وتفقّد قسم السجلات المرتبطة
## أخطاء شائعة يجب تجنّبها
| الخطأ | المشكلة | الحل |
| ------------------------- | ---------------------------------------------- | ----------------------------------------------------------- |
| **ترتيب استيراد خاطئ** | استيراد الأشخاص قبل الشركات | استورد دائمًا الأصول أولًا، ثم التوابع |
| **تنسيق نطاق غير صحيح** | استخدام `acme.com` بدلًا من `https://acme.com` | استخدم تنسيق عنوان URL الكامل مع `https://` |
| **حقول فريدة متعددة** | تعيين كلٍّ من `companyId` و`companyDomain` | قم بتعيين مُعرّف فريد واحد فقط |
| **حقل علاقة مفقود** | حقل العلاقة غير موجود في نموذج البيانات | قم بإنشائه ضمن **الإعدادات → نموذج البيانات** قبل الاستيراد |
| **سجلات غير موجودة** | سجل الأصل غير موجود في Twenty | استورد سجلات الأصل أولًا، أو تحقّق من الأخطاء الإملائية |
| **عدم تطابق حالة الأحرف** | `Acme.com` في الملف ولكن `acme.com` في Twenty | تأكّد من تطابق حالة الأحرف تمامًا |
## الربط بأعضاء مساحة العمل
عند الربط بأعضاء مساحة العمل (فريقك):
* استخدم **عنوان بريدهم الإلكتروني**، وليس اسمهم
* مثال: `owner@yourcompany.com`، وليس "John Smith"
```csv
taskName,assignedTo
Follow up with client,john@yourcompany.com
Review proposal,jane@yourcompany.com
```
## الأسئلة الشائعة
<AccordionGroup>
<Accordion title="ماذا لو لم يكن لدى سجل الأصل نطاق أو بريد إلكتروني؟">
لديك خياران:
1. استخدم `id` الخاص بـ Twenty (صدّر سجلات الأصل للحصول على معرّفاتها)
2. أنشئ حقلًا فريدًا مخصصًا في نموذج البيانات لتخزين معرّف خارجي من نظامك السابق
</Accordion>
<Accordion title="هل يمكنني تحديث العلاقات على السجلات الموجودة؟">
نعم! ضمّن المُعرّف الفريد لسجل التابع (مثلًا، `email` للأشخاص) وقيمة العلاقة الجديدة. سيقوم الاستيراد بتحديث العلاقة.
</Accordion>
<Accordion title="هل يمكنني استيراد علاقات عديدة-إلى-عدة؟">
العلاقات عديدة-إلى-عدة غير مدعومة للاستيراد بعد. هذا مُخطّط للنصف الأول من عام 2026.
</Accordion>
<Accordion title="هل يمكنني الربط بأنواع كائنات متعددة (مثل ربط الملاحظات بالأشخاص والشركات معًا)؟">
العلاقات التي تشير إلى أنواع كائنات متعددة غير مدعومة للاستيراد/التصدير بعد. هذا على خارطة الطريق لدينا.
</Accordion>
<Accordion title="ماذا يحدث إذا كان سجل الأصل غير موجود؟">
سيعرض الاستيراد خطأً لذلك الصف. يمكنك إما:
* استورد سجل الأصل أولًا، ثم أعد الاستيراد
* أصلِح قيمة المرجع
* أزل الصف من الاستيراد
</Accordion>
<Accordion title="لماذا لا يتم ربط العلاقة بشكل صحيح؟">
أسباب شائعة:
* تنسيق غير صحيح (استخدم `https://domain.com` للنطاقات)
* عدم تطابق حالة الأحرف (تحقّق من التهجئة الدقيقة)
* الأصل غير موجود (استورد الأصول أولًا)
* تعيين عدة مُعرّفات (استخدم واحدًا فقط)
</Accordion>
</AccordionGroup>
<Warning>
**تذكير: السجلات المحذوفة حذفًا ناعمًا تُحتسب ضمن التفرد.**
إذا كنت تتلقى أخطاء "not found" ولكن يبدو أن السجل موجود، فتحقّق من قائمة الأوامر → عرض السجلات المحذوفة. قد يكون السجل الأصل قد حُذِف حذفًا منطقيًا.
</Warning>
## استكشاف الأخطاء وإصلاحها
هل تواجه مشكلات؟ اطّلع على:
* [كيفية إصلاح أخطاء الاستيراد](/l/ar/user-guide/data-migration/how-tos/fix-import-errors)
* [قدرات استيراد العلاقات](/l/ar/user-guide/data-migration/capabilities/import-relations)
* [قيود التفرد](/l/ar/user-guide/data-migration/capabilities/uniqueness-constraints)